JList列表选择项展示

wen java案例 1

本文目录导读:

JList列表选择项展示

  1. 基本JList创建
  2. 选择模式设置
  3. 获取选择项的方法
  4. 完整示例:带事件监听的JList
  5. 自定义渲染器(显示图标+文本)
  6. 动态修改列表数据
  7. 键盘快捷键支持

我来详细介绍Java Swing中JList列表选择项的展示方法。

基本JList创建

import javax.swing.*;
import java.awt.*;
public class JListDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JList Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        // 创建数据
        String[] data = {"选项1", "选项2", "选项3", "选项4", "选项5"};
        // 创建JList
        JList<String> list = new JList<>(data);
        // 添加到滚动面板
        JScrollPane scrollPane = new JScrollPane(list);
        frame.add(scrollPane);
        frame.setVisible(true);
    }
}

选择模式设置

// 单选模式(默认)
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 单区间选择
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
// 多选模式
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

获取选择项的方法

// 获取选中的值
String selectedValue = list.getSelectedValue();
// 获取选中索引
int selectedIndex = list.getSelectedIndex();
// 获取所有选中的值(多选模式)
List<String> selectedValues = list.getSelectedValuesList();
// 获取所有选中的索引
int[] selectedIndices = list.getSelectedIndices();
// 判断是否选中
boolean isSelected = !list.isSelectionEmpty();

完整示例:带事件监听的JList

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class JListSelectionDemo extends JFrame {
    private JList<String> list;
    private JTextArea textArea;
    public JListSelectionDemo() {
        setTitle("JList 选择项展示");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLayout(new BorderLayout(10, 10));
        // 创建数据
        String[] data = {
            "Apple", "Banana", "Orange", 
            "Grape", "Watermelon", "Strawberry"
        };
        // 创建JList
        list = new JList<>(data);
        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        // 添加选择监听器
        list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {  // 防止重复触发
                    updateSelectionInfo();
                }
            }
        });
        // 添加双击监听器
        list.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    String selected = list.getSelectedValue();
                    JOptionPane.showMessageDialog(JListSelectionDemo.this, 
                        "双击选中: " + selected);
                }
            }
        });
        // 创建文本显示区域
        textArea = new JTextArea(5, 20);
        textArea.setEditable(false);
        // 布局
        JScrollPane listScrollPane = new JScrollPane(list);
        JScrollPane textScrollPane = new JScrollPane(textArea);
        add(listScrollPane, BorderLayout.CENTER);
        add(textScrollPane, BorderLayout.SOUTH);
        // 按钮面板
        JPanel buttonPanel = new JPanel();
        JButton clearButton = new JButton("清除选择");
        clearButton.addActionListener(e -> clearSelection());
        JButton selectAllButton = new JButton("全选");
        selectAllButton.addActionListener(e -> selectAll());
        buttonPanel.add(clearButton);
        buttonPanel.add(selectAllButton);
        add(buttonPanel, BorderLayout.NORTH);
    }
    private void updateSelectionInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append("选择模式: ").append(getSelectionModeText()).append("\n");
        sb.append("是否选中: ").append(!list.isSelectionEmpty()).append("\n");
        if (!list.isSelectionEmpty()) {
            // 单选信息
            sb.append("选中的值: ").append(list.getSelectedValue()).append("\n");
            sb.append("选中索引: ").append(list.getSelectedIndex()).append("\n");
            // 多选信息
            sb.append("所有选中的值: ").append(list.getSelectedValuesList()).append("\n");
            int[] indices = list.getSelectedIndices();
            sb.append("所有选中的索引: ");
            for (int i = 0; i < indices.length; i++) {
                sb.append(indices[i]);
                if (i < indices.length - 1) {
                    sb.append(", ");
                }
            }
            sb.append("\n");
            sb.append("选中数量: ").append(list.getSelectedValuesList().size());
        }
        textArea.setText(sb.toString());
    }
    private String getSelectionModeText() {
        switch (list.getSelectionMode()) {
            case ListSelectionModel.SINGLE_SELECTION:
                return "单选";
            case ListSelectionModel.SINGLE_INTERVAL_SELECTION:
                return "单区间选择";
            case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION:
                return "多选";
            default:
                return "未知";
        }
    }
    private void clearSelection() {
        list.clearSelection();
    }
    private void selectAll() {
        list.setSelectionInterval(0, list.getModel().getSize() - 1);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new JListSelectionDemo().setVisible(true);
        });
    }
}

自定义渲染器(显示图标+文本)

import javax.swing.*;
import java.awt.*;
public class CustomListRenderer extends JLabel implements ListCellRenderer<String> {
    public CustomListRenderer() {
        setOpaque(true);
        setFont(new Font("Arial", Font.PLAIN, 14));
    }
    @Override
    public Component getListCellRendererComponent(
            JList<? extends String> list, 
            String value, 
            int index, 
            boolean isSelected, 
            boolean cellHasFocus) {
        setText(value);
        // 根据值设置图标
        if (value.contains("Apple")) {
            setIcon(new ImageIcon("apple_icon.png")); // 实际项目中需要真实图标
            setForeground(Color.RED);
        } else if (value.contains("Banana")) {
            setIcon(new ImageIcon("banana_icon.png"));
            setForeground(Color.YELLOW);
        } else {
            setIcon(null);
            setForeground(Color.BLACK);
        }
        // 选中效果
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
        }
        return this;
    }
}
// 使用自定义渲染器
list.setCellRenderer(new CustomListRenderer());

动态修改列表数据

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
public class DynamicListDemo extends JFrame {
    private DefaultListModel<String> listModel;
    private JList<String> list;
    private JTextField inputField;
    public DynamicListDemo() {
        setTitle("动态列表");
        setSize(300, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 创建可修改的列表模型
        listModel = new DefaultListModel<>();
        listModel.addElement("初始项目1");
        listModel.addElement("初始项目2");
        list = new JList<>(listModel);
        // 输入和按钮
        inputField = new JTextField(15);
        JButton addButton = new JButton("添加");
        JButton removeButton = new JButton("删除选中");
        addButton.addActionListener(e -> addItem());
        removeButton.addActionListener(e -> removeSelectedItem());
        // 布局
        JPanel inputPanel = new JPanel();
        inputPanel.add(inputField);
        inputPanel.add(addButton);
        inputPanel.add(removeButton);
        add(new JScrollPane(list), BorderLayout.CENTER);
        add(inputPanel, BorderLayout.SOUTH);
        // 添加监听
        list.addListSelectionListener(e -> {
            if (!e.getValueIsAdjusting()) {
                String selected = list.getSelectedValue();
                if (selected != null) {
                    inputField.setText(selected);
                }
            }
        });
    }
    private void addItem() {
        String text = inputField.getText().trim();
        if (!text.isEmpty()) {
            listModel.addElement(text);
            inputField.setText("");
            inputField.requestFocus();
        }
    }
    private void removeSelectedItem() {
        int selectedIndex = list.getSelectedIndex();
        if (selectedIndex != -1) {
            listModel.remove(selectedIndex);
        }
    }
    public static void main(String[] args) {
        new DynamicListDemo().setVisible(true);
    }
}

键盘快捷键支持

// 设置键盘选择模式(A, B, C...快速跳转)
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 注册键盘事件
list.registerKeyboardAction(
    e -> handleKeyAction(),
    KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),
    JComponent.WHEN_FOCUSED
);
// 设置滚动速度
list.getComponentPopupMenu(); // 右键菜单
  • 选择模式:支持单选、单区间、多选三种模式
  • 监听方式:使用ListSelectionListener监听选择变化
  • 数据模型:使用DefaultListModel实现动态数据
  • 渲染器:自定义ListCellRenderer美化显示
  • 事件处理:支持鼠标、键盘事件

这些示例涵盖了JList选择项展示的主要功能,可以根据实际需求选择使用。

抱歉,评论功能暂时关闭!