什么是流畅重新排序JList的“最佳”方法?

时间:2012-04-06 18:26:17

标签: java swing list jlist

我正在创建一个基于swing的应用程序,其中我有一个JList,它定期使用相同数据的不同顺序进行更新,不经常更新新项目,并且不经常使用较少的项目进行更新。我正试图找出使这个看起来很好的最佳方法。现在,我只是打电话给

JList.setListData(String [] data);

看起来不太好,它会清除所选项目。

我想要一种更新它的方法,只有当它从列表中删除时才清除所选项目,否则保持选择相同的项目,即使它们的索引发生变化。我正在考虑跟踪选择哪些索引,然后在更改数据后设置所选项目,但这听起来很糟糕。我还查看了ListModels并跟踪了我自己,但似乎选择了哪些项目保存在JList本身中,这样也无法正常工作。

我真的很感激任何建议。

2 个答案:

答案 0 :(得分:4)

似乎标准JList没有调整排序的方法(为什么它们只是将它添加到JTable ...),但有一个tutorial for sorted lists < / p>

答案 1 :(得分: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);
        }
    }
}