我正在制作一个程序,打印出JList上的项目,并尝试使用尽可能少的内存。因此,我只想使用一个JList变量,但屏幕上仍然有两个我可以读取的列表。我在查找如何在第一个列表中找到我初始化并添加到JPanel的值时遇到了问题。
JPanel初始化方法:
public void run() {
panel = new JPanel(null);
//Initalize components
//List 1
ArrayList<String> st = new ArrayList<String>();
for(int i=0;i<10;i++) st.add("Number: " + i);
jli = new JList(st.toArray());
jli.setName("MyList1");
jli.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jli.setLayoutOrientation(JList.VERTICAL);
jli.setSelectedIndex(-1);
jli.setVisibleRowCount(-1);
JScrollPane jsp = new JScrollPane(jli);
jsp.setSize(new Dimension(120, 130));
jsp.setLocation(5, 5);
panel.add(jsp);
//List 2
st = new ArrayList<String>();
for(int i=0;i<10;i++) st.add("#: " + i);
jli = new JList(st.toArray());
jli.setName("MyList2");
jli.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jli.setLayoutOrientation(JList.VERTICAL);
jli.setSelectedIndex(-1);
jli.setVisibleRowCount(-1);
jsp = new JScrollPane(jli);
jsp.setSize(new Dimension(120, 130));
jsp.setLocation(150, 5);
panel.add(jsp);
//Button 1
jb = new JButton("Print 1");
jb.addActionListener(this);
jb.setLocation(5, 140);
jb.setSize(jb.getPreferredSize());
panel.add(jb);
//Button 2
jb = new JButton("Print 2");
jb.addActionListener(this);
jb.setLocation(120, 140);
jb.setSize(jb.getPreferredSize());
panel.add(jb);
}
ActionPreformed方法:
public void actionPerformed(ActionEvent e) {
switch (e.getActionCommand()) {
case "Print 1":
//This is where I need help
break;
case "Print 2":
System.out.println(jli.getSelectedValue());
break;
}
}
简而言之,如何在不创建两个JList变量的情况下从创建的第一个JList和创建的第二个JList中查找数据?
答案 0 :(得分:0)
虽然我发现它很奇怪,但如果你坚持只有每种类型的一个变量,那么你将无法直接访问第一个实例化列表。假设您的panel
和jli
是全局定义的,您可以通过搜索panel
的子组件找到列表:
@Override
public void actionPerformed(ActionEvent e) {
Component[] components = panel.getComponents();
for (Component component : components) {
// child component must be a JList, but not jli
if(component instanceof JList && !component.equals(jli)) {
JList firstList = (JList) component;
}
}
}
我仍然想重复一下,这段代码是一个完整的开销,可以通过引入另一个JList
变量来简单地消除。而不是直接访问列表,您将不得不搜索它,消耗CPU时间。另外,如果你有第三个JList
,你会怎么做?然后,您无法将两个不可访问的JList
彼此区分开来。如果您仍然坚持使用一个变量,请考虑使用List
JList
s:
List<JList> allMyJLists = new LinkedList<>();
JList jli = new JList(); // first JList
allMyJLists.add(jli);
jli = new JList(); // second JList
allMyJLists.add(jli);
现在使用
访问第一个JList
allMyJLists.get(0);
和第二个
allMyJLists.get(1);