Java的 JList

JList 是 Java Swing 库中的一个组件,用于展示一个元素列表供用户选择。JList 可以设置为单选或多选,并且可以通过滚动条浏览,适合于在图形用户界面(GUI)中显示一组对象。

创建 JList

在 Java 中创建一个 JList 非常简单,以下是一个创建含有字符串列表的 JList 的基本示例:

import javax.swing.*;

public class JListExample {
    public static void main(String[] args) {
        // 创建 JFrame 实例
        JFrame frame = new JFrame("JList Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 数据数组,将作为列表项显示
        String[] data = {"Item 1", "Item 2", "Item 3", "Item 4"};

        // 创建 JList 实例
        JList<String> list = new JList<>(data);

        // 添加到 JScrollPane,这样当列表项过多时会自动出现滚动条
        JScrollPane scrollPane = new JScrollPane(list);
        frame.add(scrollPane);

        // 设置窗口大小并显示
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

JList 常用方法

JList 提供了很多方法来管理列表项,下面是一些常用方法:

  • setSelectionMode(int selectionMode): 设置列表的选择模式。可以是 ListSelectionModel.SINGLE_SELECTIONListSelectionModel.SINGLE_INTERVAL_SELECTION, 或者 ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
  • getSelectedValue(): 返回当前选中的项。
  • getSelectedValuesList(): 返回所有选中项的列表(在多选模式下)。
  • setListData(E[] listData): 设置列表显示的新数据数组。
  • addListSelectionListener(ListSelectionListener listener): 添加一个监听器,以侦听列表选择变化事件。

事件处理

JList 支持列表选择监听器,当用户选择列表中的项时,可以触发事件。下面的示例展示了如何为 JList 添加一个 ListSelectionListener

list.addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (!e.getValueIsAdjusting()) { // 防止事件被重复处理
            String selectedValue = list.getSelectedValue();
            System.out.println("Selected: " + selectedValue);
        }
    }
});

自定义渲染器

默认情况下,JList 会使用 toString() 方法来显示列表项。如果想要自定义列表项的显示方式,你可以通过设置自定义的单元格渲染器来实现。ListCellRenderer 接口允许你控制列表项的显示。以下是一个简单的示例:

class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText(value.toString());
        
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        
        setEnabled(list.isEnabled());
        setFont(list.getFont());
        setOpaque(true);
        
        return this;
    }
}

list.setCellRenderer(new MyCellRenderer());

在这个例子中,MyCellRenderer 类实现了 ListCellRenderer 接口并且可以自定义项的外观。当列表项被渲染时,getListCellRendererComponent 方法会被调用。

JScrollPane

通常,JList 会放在一个 JScrollPane 中,以便于当列表项超出视图范围时可以滚动查看。

小结

JList 是一个功能丰富的组件,适用于各种列表选择需求。通过事件监听和自定义渲染器,你可以创建出既美观又实用的列表组件。上述示例提供了 JList 最基本的用法,但是 JList 还有许多其他的高级特性,比如拖放支持、自定义模型等JList 是 Java Swing 库中的一个组件,用于展示一个元素列表供用户选择。JList 可以设置为单选或多选,并可以与滚动条结合使用以支持长列表的滚动浏览。它适合用于在图形用户界面(GUI)中显示一组对象。

基本使用

在 Java Swing 中,要创建和使用 JList,需要以下几个步骤:

  1. 创建 JList 对象:可以通过传递一个列表数据模型或数组来创建 JList
  2. 配置 JList:设置 JList 的一些属性,比如选择模式(单选、多选)、可见行数等。
  3. 添加到 JScrollPane(如果需要滚动功能):将 JList 放入一个 JScrollPane 中以支持滚动。
  4. 处理事件:为 JList 添加事件监听器来处理用户的选择事件。

示例代码

以下是一个简单的 JList 示例,其中包含了创建 JList、配置、添加到 JScrollPane 和简单的事件处理:

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class SimpleJListExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // 创建 JFrame 容器
                JFrame frame = new JFrame("JList Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                // 创建 JList
                String[] data = {"Item 1", "Item 2", "Item 3", "Item 4"};
                JList<String> list = new JList<>(data);

                // 设置选择模式(单选模式)
                list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

                // 添加事件监听器
                list.addListSelectionListener(new ListSelectionListener() {
                    public void valueChanged(ListSelectionEvent e) {
                        if (!e.getValueIsAdjusting()) {
                            System.out.println("Selected value: " + list.getSelectedValue());
                        }
                    }
                });

                // 将 JList 放入 JScrollPane
                JScrollPane scrollPane = new JScrollPane(list);

                // 添加到 JFrame 中
                frame.add(scrollPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

JList 常用方法

下面列出了一些常用的 JList 方法:

  • setSelectionMode(int mode): 设置列表的选择模式。例如 ListSelectionModel.SINGLE_SELECTION 代表单选模式。
  • getSelectedValue(): 获取当前选中的列表项。
  • getSelectedValuesList(): 获取所有选中的列表项(适用于多选模式)。
  • setListData(T[] listData): 将列表的数据模型设置为给定数组。
  • addListSelectionListener(ListSelectionListener listener): 添加一个监听器,当用户更改所选列表项时接收通知。

自定义列表渲染器

默认情况下,JList 使用 toString() 方法来渲染列表项。如果想要自定义列表项的显示方式,可以通过设置自定义的单元格渲染器来实现:

list.setCellRenderer(new ListCellRenderer<String>() {
    @Override
    public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) {
        JLabel label = new JLabel(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;
    }
});

JScrollPane

如果 JList 元素多到超出了显示区域,通常会将 JList 放入 JScrollPane 中,这样用户就可以滚动查看所有的列表项了。



 

以下是几个不同场景下使用 JList 的例子。

例子 1:多选模式

在这个例子中,我们设置 JList 为多选模式,允许用户选择多个列表项。

import javax.swing.*;
import java.util.Arrays;

public class MultiSelectionExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Multi-Selection JList Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            String[] data = {"Apple", "Orange", "Banana", "Pear", "Peach"};

            JList<String> list = new JList<>(data);
            list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

            JButton button = new JButton("Show Selections");
            button.addActionListener(e -> {
                // 获取选中的元素
                java.util.List<String> selectedValues = list.getSelectedValuesList();
                JOptionPane.showMessageDialog(frame, "Selected: " + Arrays.toString(selectedValues.toArray()));
            });

            frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
            frame.add(new JScrollPane(list));
            frame.add(button);

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

例子 2:自定义列表项的显示方式

在这个例子中,我们自定义了列表渲染器来改变列表项的显示方式。这里我们显示带有图标的列表项。

import javax.swing.*;
import java.awt.*;

public class CustomRendererExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Custom Renderer JList Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // 假设这是我们的图标路径(请替换为真实路径)
            ImageIcon icon = new ImageIcon("path/to/your/icon.png");

            String[] data = {"Item 1", "Item 2", "Item 3", "Item 4"};

            JList<String> list = new JList<>(data);
            list.setCellRenderer(new DefaultListCellRenderer() {
                @Override
                public Component getListCellRendererComponent(
                        JList<?> list,
                        Object value,
                        int index,
                        boolean isSelected,
                        boolean cellHasFocus) {
                    Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                    setIcon(icon);
                    return c;
                }
            });

            frame.add(new JScrollPane(list));
            frame.setSize(300, 200);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

例子 3:响应双击列表项事件

在这个例子中,我们添加了一个鼠标适配器来处理双击列表项的事件。

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class DoubleClickEventExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Double Click JList Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            String[] data = {"Node.js", "Python", "Ruby", "Java"};

            JList<String> list = new JList<>(data);
            list.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent evt) {
                    if (evt.getClickCount() == 2) {
                        int index = list.locationToIndex(evt.getPoint());
                        JOptionPane.showMessageDialog(frame, "Double-clicked on: " + list.getModel().getElementAt(index));
                    }
                }
            });

            frame.add(new JScrollPane(list));
            frame.setSize(300, 200);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值