如何创建动态 JList?
How can I create dynamic JLists?
我有多个 Jlist
组件。选择第一个列表中的项目后,下一个列表应动态显示一组新的可能选择。
例如,第一个列表可能包含三个项目,即 "A" 、"B" 、"C"。当我单击 "A" 时,下一个列表应显示 1、2、3、4、5 等。当我单击 "B" 时,下一个列表应显示 7、8、9 等。我需要这些列出处理此逻辑的列表。
目标是实现这样的 GUI:
大纲,
添加一个ListSelectionListener
to the first JList
.
在选择处理程序中,使用 setModel()
将第二个列表的模型设置为当前选择的正确 ListModel
。
list1.addListSelectionListener((ListSelectionEvent e) -> {
if (!e.getValueIsAdjusting()) {
list2.setModel(models.get(list1.getSelectedIndex()));
}
});
类似地,将ListSelectionListener
添加到第二个JList
并相应地更新第三个面板。
显示了类似的方法here for ComboBoxModel
. This related example使用类似的方法在列中显示文件系统树。
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
/** @see */
public class DynamicJList {
private final JList<String> list1 = new JList<>(new String[]{"A", "B"});
private final JList<String> list2 = new JList<>();
private final List<DefaultListModel> models = new ArrayList<>();
private void display() {
JFrame f = new JFrame("DynamicJList");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultListModel<String> model1 = new DefaultListModel<>();
model1.addElement("A1");
model1.addElement("A2");
model1.addElement("A3");
models.add(model1);
DefaultListModel<String> model2 = new DefaultListModel<>();
model2.addElement("B1");
model2.addElement("B2");
models.add(model2);
list2.setModel(model1);
list1.addListSelectionListener((ListSelectionEvent e) -> {
if (!e.getValueIsAdjusting()) {
list2.setModel(models.get(list1.getSelectedIndex()));
}
});
JPanel panel = new JPanel(new GridLayout(1, 0));
panel.add(list1);
panel.add(list2);
f.add(panel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new DynamicJList()::display);
}
}
我有多个 Jlist
组件。选择第一个列表中的项目后,下一个列表应动态显示一组新的可能选择。
例如,第一个列表可能包含三个项目,即 "A" 、"B" 、"C"。当我单击 "A" 时,下一个列表应显示 1、2、3、4、5 等。当我单击 "B" 时,下一个列表应显示 7、8、9 等。我需要这些列出处理此逻辑的列表。
目标是实现这样的 GUI:
大纲,
添加一个
ListSelectionListener
to the firstJList
.在选择处理程序中,使用
setModel()
将第二个列表的模型设置为当前选择的正确ListModel
。list1.addListSelectionListener((ListSelectionEvent e) -> { if (!e.getValueIsAdjusting()) { list2.setModel(models.get(list1.getSelectedIndex())); } });
类似地,将
ListSelectionListener
添加到第二个JList
并相应地更新第三个面板。
显示了类似的方法here for ComboBoxModel
. This related example使用类似的方法在列中显示文件系统树。
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
/** @see */
public class DynamicJList {
private final JList<String> list1 = new JList<>(new String[]{"A", "B"});
private final JList<String> list2 = new JList<>();
private final List<DefaultListModel> models = new ArrayList<>();
private void display() {
JFrame f = new JFrame("DynamicJList");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultListModel<String> model1 = new DefaultListModel<>();
model1.addElement("A1");
model1.addElement("A2");
model1.addElement("A3");
models.add(model1);
DefaultListModel<String> model2 = new DefaultListModel<>();
model2.addElement("B1");
model2.addElement("B2");
models.add(model2);
list2.setModel(model1);
list1.addListSelectionListener((ListSelectionEvent e) -> {
if (!e.getValueIsAdjusting()) {
list2.setModel(models.get(list1.getSelectedIndex()));
}
});
JPanel panel = new JPanel(new GridLayout(1, 0));
panel.add(list1);
panel.add(list2);
f.add(panel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new DynamicJList()::display);
}
}