Swing JList 元素移动(增加 删除)

Requirements

在第一个列表框中添加北京、上海、天津、江苏、浙江、广东6个选项,
当双击两个列表框,可实现将当前列表框中的选中的选项添加到另一个列表框中,并从当前列表框中删除该选项。
如图:
在这里插入图片描述
在这里插入图片描述

API

  • mouseListener.getClickCount() 获取鼠标点击次数
  • setListData(Vector<E>)setListData(E[]) 更新列表项数据

Code

// 实现接口:MouseListener,监听双击事件
class MyFrame extends JFrame implements MouseListener {
    Vector<String> leftData;
    Vector<String> rightData;
    JList<String> left, right;
    JScrollPane leftPanel, rightPanel;

    MyFrame() {
        leftData = new Vector<>(Arrays.asList("北京、上海、天津、江苏、浙江、广东".split("、")));
        left = new JList<>(leftData);
        leftPanel = new JScrollPane(left);

        rightData = new Vector<>();
        right = new JList<>();
        rightPanel = new JScrollPane(right);

        setLayout(new GridLayout(1, 2));
        add(leftPanel);
        add(rightPanel);

        left.addMouseListener(this);
        right.addMouseListener(this);

        setVisible(true);
        setSize(300, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    /**
     * 点击鼠标事件
     * @param e
     */
    @Override
    public void mouseClicked(MouseEvent e) {
        int clickCount = e.getClickCount();
        if (clickCount == 2) {
            doubleClick(e);
        }
    }

    private void doubleClick(MouseEvent e) {
        Object source = e.getSource();
        if (source == left) {
            move(left, leftData, right, rightData);
        } else if (source == right) {
            move(right, rightData, left, leftData);
        }
    }

    private void move(JList<String> from, Vector<String> fromData, JList<String> to, Vector<String> toData) {
        toData.add(from.getSelectedValue());        // 先添加选中的元素到另一边
        fromData.remove(from.getSelectedIndex());   // 点击的一边删除选中元素

        to.setListData(toData);     // 刷新数据
        from.setListData(fromData);
    }

    // 按压鼠标
    @Override
    public void mousePressed(MouseEvent e) {}

    // 释放|松开鼠标
    @Override
    public void mouseReleased(MouseEvent e) {}

    // 鼠标移入
    @Override
    public void mouseEntered(MouseEvent e) {}

    // 鼠标移出
    @Override
    public void mouseExited(MouseEvent e) {}
}

运行:

public class Test {
    public static void main(String[] args) {
        new MyFrame();
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JList 是 Java Swing 组件中的一个列表组件,可以用来展示一组数据。以下是 JList 的用法: 1. 创建 JList 对象: ``` JList list = new JList(); ``` 2. 设置数据模型: JList 组件需要一个数据模型来存储数据,可以使用 DefaultListModel 类来创建数据模型: ``` DefaultListModel model = new DefaultListModel(); model.addElement("Item 1"); model.addElement("Item 2"); list.setModel(model); ``` 3. 设置显示样式: 可以通过设置 ListCellRenderer 对象来改变每个列表项的显示样式: ``` list.setCellRenderer(new MyListRenderer()); ``` 4. 添加到容器中: 将 JList 添加到容器中即可显示出来: ``` JScrollPane scrollPane = new JScrollPane(list); frame.getContentPane().add(scrollPane); ``` 完整示例代码: ``` import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; public class MyListRenderer implements ListCellRenderer<String> { public static void main(String[] args) { JFrame frame = new JFrame(); JList<String> list = new JList<String>(); DefaultListModel<String> model = new DefaultListModel<String>(); model.addElement("Item 1"); model.addElement("Item 2"); list.setModel(model); list.setCellRenderer(new MyListRenderer()); JScrollPane scrollPane = new JScrollPane(list); frame.getContentPane().add(scrollPane); frame.pack(); frame.setVisible(true); } public MyListRenderer() { } @Override public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = new JLabel(); label.setText(value); if (isSelected) { label.setBackground(list.getSelectionBackground()); label.setForeground(list.getSelectionForeground()); } else { label.setBackground(list.getBackground()); label.setForeground(list.getForeground()); } label.setOpaque(true); return label; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值