我为尝试设计此问题的解决方案感到不知所措-这是经验不足的副产品。
我的目标是读取XML输入文件,存储来自XML的信息,并使用来自XML的数据填充两个组合框。第二个组合框的内容将根据第一个组合框的选择而变化。
给定此XML结构:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Category xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Node>
<ID>Unique string</ID>
<Name>Unique string</Name>
<Code>Generic string<Code>
<Kind>Generic string</Kind>
<Frame>Generic string</Frame>
...
</Node>
...
</Category>
第一个组合框:
必须仅包含在“种类”部分中找到的唯一值。
第二个组合框:
包含每个节点的种类等于在第一个组合框中选择的种类的所有节点的所有名称条目。
关于XML源:
它是在外部维护和生成的。
ID部分中的值将始终是唯一的。
“名称”部分中的值将始终是唯一的。
该模式将(据说)永远不会改变。
将来,新的唯一值可能会出现在“种类”部分中。
我建议的解决方案:
创建一个类XMLNode来表示来自XML源的Node。
XMLNode类的成员对应于每个Node中的标签。
遍历所有节点,并为每个节点创建一个XMLNode。
在遍历节点时:
在哈希图中添加XMLNode对象,其中Keys = XMLNode.ID,而vals = XMLNode。
创建一组唯一的种类。
从种类条目数组中填充组合框一。
从名称数据填充组合框两个。
这是合适的方法,还是我忽略了更好/更容易/更优雅的解决方案?
如果我的工作方向正确,那么我提出的解决方案是否存在明显的缺陷?
最佳答案
使用ComboBoxModel (Java6)存储JComboBox的项目
a ll updates to the JComboBox and its ComboBoxModel must be done on EDT
将所有FileIO
或Database
事件重定向到Runnable#Thread
或SwingWorker
也许这种逻辑可以帮助您,
码
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class ComboBoxTwo extends JFrame implements ActionListener, ItemListener {
private static final long serialVersionUID = 1L;
private JComboBox mainComboBox;
private JComboBox subComboBox;
private Hashtable<Object, Object> subItems = new Hashtable<Object, Object>();
public ComboBoxTwo() {
String[] items = {"Select Item", "Color", "Shape", "Fruit"};
mainComboBox = new JComboBox(items);
mainComboBox.addActionListener(this);
mainComboBox.addItemListener(this);
//prevent action events from being fired when the up/down arrow keys are used
//mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
getContentPane().add(mainComboBox, BorderLayout.WEST);
subComboBox = new JComboBox();// Create sub combo box with multiple models
subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
subComboBox.addItemListener(this);
getContentPane().add(subComboBox, BorderLayout.EAST);
String[] subItems1 = {"Select Color", "Red", "Blue", "Green"};
subItems.put(items[1], subItems1);
String[] subItems2 = {"Select Shape", "Circle", "Square", "Triangle"};
subItems.put(items[2], subItems2);
String[] subItems3 = {"Select Fruit", "Apple", "Orange", "Banana"};
subItems.put(items[3], subItems3);
// mainComboBox.setSelectedIndex(1);
}
@Override
public void actionPerformed(ActionEvent e) {
String item = (String) mainComboBox.getSelectedItem();
Object o = subItems.get(item);
if (o == null) {
subComboBox.setModel(new DefaultComboBoxModel());
} else {
subComboBox.setModel(new DefaultComboBoxModel((String[]) o));
}
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (e.getSource() == mainComboBox) {
if (mainComboBox.getSelectedIndex() != 0) {
FirstDialog firstDialog = new FirstDialog(ComboBoxTwo.this,
mainComboBox.getSelectedItem().toString(), "Please wait, Searching for ..... ");
}
}
}
}
private class FirstDialog extends JDialog {
private static final long serialVersionUID = 1L;
FirstDialog(final Frame parent, String winTitle, String msgString) {
super(parent, winTitle);
setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
JLabel myLabel = new JLabel(msgString);
JButton bNext = new JButton("Stop Processes");
add(myLabel, BorderLayout.CENTER);
add(bNext, BorderLayout.SOUTH);
bNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
setVisible(false);
}
});
javax.swing.Timer t = new javax.swing.Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
t.setRepeats(false);
t.start();
setLocationRelativeTo(parent);
setSize(new Dimension(400, 100));
setVisible(true);
}
}
public static void main(String[] args) {
JFrame frame = new ComboBoxTwo();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
关于java - 设计:2个jcomboboxes,第2个列表框取决于从第1个框中选择的内容,来自XML的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12919128/