4

我正在制作一个基于摇摆的应用程序,其中我有一个 JList 定期更新相同数据的不同顺序,很少更新新项目,也很少更新较少项目。我正在尝试找出使这看起来不错的最佳方法。现在,我只是打电话

JList.setListData(String [] data);

这看起来不太好,它清除了选定的项目。

我想要一种更新它的方法,如果它从列表中删除,则只清除选定的项目,否则保持相同的项目被选中,即使它们的索引发生变化。我正在研究跟踪选择了哪些索引,然后在更改数据后设置所选项目,但这听起来很可怕。我还查看了 ListModels 并跟踪我自己的,但似乎选择的项目保存在 JList 本身中,因此也不能完美地工作。

我真的很感激任何建议。

4

2 回答 2

4

似乎标准JList没有调整排序的方法(为什么他们只将它添加到JTable...),但是有一个排序列表的教程

于 2012-04-06T18:37:06.430 回答
4

我给你做了一个工作的例子。

我使用了JList您要求的类似按钮,添加了从列表中选择、添加和删除的按钮。

无论如何,希望这会有所帮助!

干杯。

public class Test {

    private static String selectedValue = null;
    private static JList jList = new JList();

    public static void main(String args[]) {
        JFrame jFrame = new JFrame();
        jFrame.setSize(500, 500);
        jFrame.setLocationRelativeTo(null);
        jFrame.setLayout(new GridLayout(4, 1));

        jList = new JList(new String[]{"1", "2", "3", "4", "5"});
        jFrame.add(jList);

        JButton rearrangeButton = new JButton("rearrange");
        rearrangeButton.addActionListener(new Test().new SelectedListener());
        jFrame.add(rearrangeButton);

        JButton addButton = new JButton("add");
        addButton.addActionListener(new Test().new SelectedListener());
        jFrame.add(addButton);

        JButton deleteButton = new JButton("delete");
        deleteButton.addActionListener(new Test().new SelectedListener());
        jFrame.add(deleteButton);

        jFrame.setVisible(true);
    }

    private class SelectedListener implements ActionListener {

        public void actionPerformed(ActionEvent actionEvent) {
            storeSelected();

            if (actionEvent.getActionCommand().equalsIgnoreCase("rearrange")) {
                jList.setListData(new String[]{"5", "4", "3", "2", "1"});
            } else if (actionEvent.getActionCommand().equalsIgnoreCase("add")) {
                List< String> items = new ArrayList< String>();

                for (int item = 0; item < jList.getModel().getSize(); item++) {
                    items.add(jList.getModel().getElementAt(item).toString());
                }

                items.add("new");

                jList.setListData(items.toArray());
            } else if (actionEvent.getActionCommand().equalsIgnoreCase("delete")) {
                List< String> items = new ArrayList< String>();

                for (int item = 0; item < jList.getModel().getSize(); item++) {
                    items.add(jList.getModel().getElementAt(item).toString());
                }

                items.remove(0);

                jList.setListData(items.toArray());
            }

            reSelect();
        }
    }

    private static void storeSelected() {
        if (jList.getSelectedIndex() > -1) {
            selectedValue = jList.getSelectedValue().toString();
        } else {
            selectedValue = null;
        }
    }

    private static void reSelect() {
        if (selectedValue != null) {
            jList.setSelectedValue(selectedValue, true);
        }
    }
}
于 2012-04-06T19:04:36.410 回答