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_SELECTION
,ListSelectionModel.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
,需要以下几个步骤:
- 创建
JList
对象:可以通过传递一个列表数据模型或数组来创建JList
。 - 配置
JList
:设置JList
的一些属性,比如选择模式(单选、多选)、可见行数等。 - 添加到
JScrollPane
(如果需要滚动功能):将JList
放入一个JScrollPane
中以支持滚动。 - 处理事件:为
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);
});
}
}