本文目录导读:

我来详细介绍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选择项展示的主要功能,可以根据实际需求选择使用。