简体   繁体   English

使用AbstractListModel使用添加/删除按钮在2个JList之间移动所选项目

[英]Moving selected items between 2 JList with add/remove buttons using AbstractListModel

I'm brand new to programming. 我是编程的新手。 It seems the more I research the more I confuse myself, I have to be over thinking what needs to be done. 似乎我越研究越觉得迷惑自己,我必须要在思想需要做什么。 abstract list model is what is needed to make the Jlist work properly. 抽象列表模式是什么是需要做Jlist正常工作。 I need to know what is right/wrong. 我需要知道什么是正确/错误的。 where do I put getselectedvalues() , if it even needs to be used? 如果甚至需要使用getselectedvalues() ,我该放在getselectedvalues()

JList Left_list = new JList();
    Left_list.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
        }
    });
    Left_list.setFont(new Font("Tahoma", Font.PLAIN, 14));
    Left_list.setModel(new AbstractListModel() {
        String[] values = new String[] {"Case", "Motherboard", "CPU", "RAM", "GPU", "HDD", "PSU"};
        public int getSize() {
            return values.length;
        }
        public Object getElementAt(int index) {
            return values[index];
        }
    });
    Left_list.setBorder(new LineBorder(new Color(0, 0, 0), 2, true));
    Left_list.setBounds(10, 11, 146, 218);
    frame.getContentPane().add(Left_list);

    JList Right_list = new JList();
    Right_list.setModel(new AbstractListModel() {
        String[] values = new String[] {};
        public int getSize() {
            return values.length;
        }
        public Object getElementAt(int index) {
            return values[index];
        }
    });
    Right_list.setBorder(new LineBorder(new Color(0, 0, 0), 2, true));
    Right_list.setBounds(278, 16, 146, 213);
    frame.getContentPane().add(Right_list);

    JButton btnNewButton = new JButton("Add>>");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    btnNewButton.setBounds(166, 91, 102, 23);
    frame.getContentPane().add(btnNewButton);

    JButton btnNewButton_1 = new JButton("<<Remove");
    btnNewButton_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    btnNewButton_1.setBounds(166, 125, 102, 23);
    frame.getContentPane().add(btnNewButton_1);

What I would recommend, is using a DefaultListModel instead, as it provides the ability to mutate the ListModel 我建议使用的是DefaultListModel ,因为它提供了对ListModel进行突变的功能

DefaultListModel<String> model = new DefaultListModel<>();
for (String item : new String[] {"Case", "Motherboard", "CPU", "RAM", "GPU", "HDD", "PSU"}) {
    model.addElement(item);
}
JList<String> Left_list= new JList<>();
Left_list.setModel(model);
//...

JList<String> Right_list = new JList<>(new DefaultListModel<String>());
//...

btnNewButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        List<String> selected = Left_list.getSelectedValuesList();
        DefaultListModel<String> left = Left_list.getModel();
        DefaultListModel<String> right = Right_list.getModel();
        for (String item : selected) {
            left.removeElement(item);
            right.addElement(item);
        }
    }
});
//...
JButton btnNewButton_1 = new JButton("<<Remove");
btnNewButton_1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        List<String> selected = Right_list.getSelectedValuesList();
        DefaultListModel<String> left = Left_list.getModel();
        DefaultListModel<String> right = Right_list.getModel();
        for (String item : selected) {
            right.removeElement(item);
            left.addElement(item);
        }
    }
});

You may need to make Left_list and Right_list instance fields in order for the ActionListener s to access them. 您可能需要设置Left_listRight_list实例字段,以便ActionListener能够访问它们。

While writing the example, I thought it would be easy to write a simple method which could move data from one list to another, something like protected void move(List<String> items, DefaultListModel from, DefaultListModel to) , which means you could simply use move(Left_list.getSelectedValuesList(), Left_list.getModel(), Right_list.getModel()) or move(Right_list.getSelectedValuesList(), Right_list.getModel(), Left_list.getModel()) to move content about and reduce the code duplication... 在编写示例时,我认为编写一个可以将数据从一个列表移动到另一个列表的简单方法很容易,例如protected void move(List<String> items, DefaultListModel from, DefaultListModel to) ,这意味着您可以简单地使用move(Left_list.getSelectedValuesList(), Left_list.getModel(), Right_list.getModel())move(Right_list.getSelectedValuesList(), Right_list.getModel(), Left_list.getModel())移动内容并减少代码复制...

JList s are really suppose to be displayed in JScrollPane s, this allows the list to be much longer/wider than the available space on the screen JList实际上应该显示在JScrollPane ,这允许列表比屏幕上的可用空间长/宽得多。

Take a look at 看一眼

...for more details ...更多细节

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM