Я пишу графический интерфейс Java. У меня есть несколько предустановленных JComboBoxes
и чтобы они могли отличать их друг от друга, я хочу расширить класс и добавить переменную enum
, которая может помочь мне отличить их друг от друга.Как расширить класс JComboBox?
Вот MCVE из двух стандартных JComboBoxes
:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class XComboBoxMCVE extends JPanel {
private JComboBox tfComboBox;
private JComboBox ynComboBox;
private JComponent[] components;
public XComboBoxMCVE() {
setLayout(new BorderLayout());
JPanel comboPanel = new JPanel(new GridLayout(0, 1, 5, 5));
Boolean[] trueFalse = { true, false };
DefaultComboBoxModel tfModel = new DefaultComboBoxModel(trueFalse);
tfComboBox = new JComboBox(tfModel);
String[] yesNo = { "Yes", "No" };
DefaultComboBoxModel ynModel = new DefaultComboBoxModel(yesNo);
ynComboBox = new JComboBox(ynModel);
components = new JComponent[] { tfComboBox, ynComboBox };
JButton printSelection = new JButton("Print Type");
printSelection.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (JComponent component : components) {
// I also have other components in component in program,
// therefore this usage..
if (component instanceof JComboBox) {
JComboBox temp = (JComboBox) component;
System.out.println("Printing selection: " + temp.getSelectedItem().toString());
// if (temp.getBoxType() == BoxType.Company){
// System.out.println("Companies say: " +
// temp.getSelectedItem().toString());
// } else if(temp.getBoxType() == BoxType.Device){
// System.out.println("Devices are: " +
// temp.getSelectedItem().toString());
// }
}
}
}
});
JPanel buttonPane = new JPanel(new GridLayout(0, 1, 5, 5));
buttonPane.add(printSelection);
comboPanel.add(tfComboBox);
comboPanel.add(ynComboBox);
add(comboPanel, BorderLayout.CENTER);
add(buttonPane, BorderLayout.PAGE_END);
}
public static void createAndShowGUI(){
JFrame frame = new JFrame("MCVE");
frame.setLayout(new BorderLayout());
XComboBoxMCVE pane = new XComboBoxMCVE();
frame.add(pane, BorderLayout.CENTER);
frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
}
class XComboBox extends JComboBox {
BoxType type;
public XComboBox(BoxType type) {
this.type = type;
}
public void setBoxType(BoxType type) {
this.type = type;
}
public BoxType getBoxType() {
return this.type;
}
public enum BoxType {
Model, Company, Device
}
}
Как пример выше, иллюстрирующий, нет никакого способа для меня отчетливый два JComboBoxes
друг от друга, когда пользователь нажимает на кнопку. Примером использования BoxType
было бы то, что один BoxType
напечатал один тип сообщения, а другой BoxType
напечатал другое сообщение. Например:
if(temp.getBoxType() == BoxType.Device){
System.out.println("The devices are: " + temp.getSelectedItem().toString());
} else if(temp.getBoxType() == BoxType.Company){
System.out.println("The companies say: " + temp.getSelectedItem().toString());
}
Однако я наткнулся на проблему с конструктором, который я пытаюсь использовать подобное тому, что я сделал с JComboBox
и вводом DefaultComboBoxModel
, который я до сих пор не реализован в XComboBox
классе.
Вопрос
Как я могу изменить XComboBox
класс, так что я могу дать ему DefaultComboBoxModel
при построении элемента?
Я хочу быть в состоянии сделать это:
ynComboBox = new XComboBox(tfModel);
ynComboBox.setBoxType(BoxType.Device);
Спасибо за любую помощь и или руководства!
1. Почему вы простирающийся JComboBox в первую очередь, как вы, кажется, не будет изменять какие-либо врожденные модели поведения? 2. Я не уверен, что вы на самом деле застряли или что представляет собой BoxType. 3. Подумайте о создании реального кода [mcve], кода, который мы можем запустить. –
Ничего себе .. да. Извините .. Исправит все как можно скорее. По какой-то причине он сохранил старый заголовок. – Zeliax
Выполнено. Не стесняйтесь спрашивать, что-то непонятно. MCVE не использует XComboBox, но я сохранил их там, поскольку они являются частью вопроса. – Zeliax