java swing Jlist 中嵌套组件 注册事件 不会触发
时间: 2023-11-09 09:08:29 浏览: 95
在Java Swing JList中嵌套组件,需要添加一个自定义的ListCellRenderer来渲染每个列表项。在这个自定义的ListCellRenderer中,你需要添加你想要的组件,并在添加组件时为它们注册事件监听器。
下面是一个简单的例子,演示如何在JList中嵌套JCheckBox,并为JCheckBox注册事件监听器:
```
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
public class JListWithCheckbox {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] items = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
JList<String> list = new JList<String>(items);
list.setCellRenderer(new CheckboxListCellRenderer());
JScrollPane scrollPane = new JScrollPane(list);
frame.getContentPane().add(scrollPane);
frame.pack();
frame.setVisible(true);
}
static class CheckboxListCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
JCheckBox checkbox = new JCheckBox(value.toString());
checkbox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("Checkbox state changed");
}
});
return checkbox;
}
}
}
```
在这个例子中,我们创建了一个JFrame,并在其中添加了一个JList。为了在列表项中嵌套JCheckBox,我们使用了一个自定义的ListCellRenderer:CheckboxListCellRenderer。在这个自定义的ListCellRenderer中,我们创建了一个JCheckBox,并为它注册了一个ItemListener。当用户点击JCheckBox时,就会触发这个ItemListener,并输出一条信息。
注意:JList对于列表项的渲染只会在需要的时候才会进行(例如,当用户滚动列表时),因此你可能需要滚动列表才能看到嵌套的JCheckBox。
阅读全文