一个JPanel上有多个JLists

时间:2014-01-17 20:02:29

标签: java swing jlist

我正在制作一个程序,打印出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中查找数据?

1 个答案:

答案 0 :(得分:0)

虽然我发现它很奇怪,但如果你坚持只有每种类型的一个变量,那么你将无法直接访问第一个实例化列表。假设您的paneljli是全局定义的,您可以通过搜索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);