【发布时间】:2016-07-15 14:19:07
【问题描述】:
我正在编写一个 Java GUI。我有一些预设 JComboBoxes 并且能够将它们彼此区分开来,我想扩展该类并添加一个 enum 变量来帮助我将它们区分开来。
这是两个标准 JComboBoxes 的 MCVE:
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. 考虑创建真正的minimal reproducible example 代码,我们可以实际运行的代码。
-
哇..是的。对不起..会尽快解决。出于某种原因,它保存了一个旧标题。
-
看起来好多了。我认为你想要做的是给
JComboBox(或XComboBox)一个以DefaultComboBoxModel为参数的构造函数。类似于以下内容:public XComboBox(DefaultComboBoxModel dcbm) { // set the CB's model } -
你可以按照@JonnyHenly 的建议去做,或者为什么不简单地使用JComboBox 的
setModel(...)方法呢?您的类从 JComboBox 扩展而来,因此它具有父类的所有公共方法。话虽如此,如果这是我的项目,我什至不会扩展 JComboBox,而是使用 JComboBoxes,也许创建一个工厂方法来创建我想要的组合。 -
并且您可以使用 HashMap 之类的 Map 将 JComboBox 与 BoxType 相关联。
标签: java swing jcombobox class-extensions