【问题标题】:Moving selected items between 2 JList with add/remove buttons using AbstractListModel使用 AbstractListModel 使用添加/删除按钮在 2 个 JList 之间移动所选项目
【发布时间】:2015-02-17 03:55:40
【问题描述】:

我是编程新手。似乎我研究得越多,我就越困惑,我不得不过度思考需要做什么。抽象列表模型是使Jlist 正常工作所需要的。我需要知道什么是对/错。如果需要使用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);

【问题讨论】:

  • 避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
  • 布局是否阻止我将所选项目从一个列表转移到另一个?
  • 不,但它会炸毁你的脸,让你的生活变得悲惨......

标签: java swing jlist


【解决方案1】:

我建议使用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);
        }
    }
});

您可能需要创建 Left_listRight_list 实例字段,以便 ActionListeners 访问它们。

在编写示例时,我认为编写一个可以将数据从一个列表移动到另一个列表的简单方法会很容易,例如protected void move(List&lt;String&gt; 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()) 来移动内容和减少代码重复...

JLists 确实假设显示在JScrollPanes 中,这允许列表比屏幕上的可用空间更长/更宽

看看

...更多详情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2013-08-13
    • 2013-04-05
    相关资源
    最近更新 更多