我正在尝试构建一个Jlist,其中包含具有单独的侦听器和行为的元素(自定义)。我的意思是,由此,当单元加载时,它应该:
现在,我设法构建的是具有CustomClass(SimpleTemplate
)的JList,它绘制了一个带有SimpleTemplate
名称的复选框,当您单击它时,将显示SimpleTemplate
的信息在另一个面板中。但是,我不知道如何将听众和事件分开,并且以前已经提出过。
到目前为止,我的代码如下:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
public class CustomJListExample extends JFrame {
private static final Dimension SIDE_PANEL_DIMENSION = new Dimension(190, 190);
private static final Dimension CONTAINER_PANEL_DIMENSION = new Dimension(400, 200);
private static final Dimension TEMPLATES_LIST_DIMENSION = new Dimension(180, 180);
private static final Border SIMPLE_BORDER = new JTextField().getBorder();
private JList<SimpleTemplate> templatesList = new JList<>();
private JLabel templateName = new JLabel();
private JLabel templateDescription = new JLabel();
public CustomJListExample() {
JPanel rightPanel = prepareRightSide();
JPanel leftPanel = prepareLeftSide();
JPanel containerPanel = new JPanel();
containerPanel.setPreferredSize(CONTAINER_PANEL_DIMENSION);
containerPanel.add(leftPanel);
containerPanel.add(rightPanel);
add(containerPanel);
pack();
}
private JPanel prepareRightSide() {
JPanel rightPanel = new JPanel();
rightPanel.setBorder(SIMPLE_BORDER);
rightPanel.setBackground(Color.GRAY);
rightPanel.setPreferredSize(SIDE_PANEL_DIMENSION);
templateName.setText("---");
templateDescription.setText("---");
rightPanel.add(templateName);
rightPanel.add(templateDescription);
return rightPanel;
}
private JPanel prepareLeftSide() {
JPanel leftPanel = new JPanel();
leftPanel.setBorder(SIMPLE_BORDER);
leftPanel.setBackground(Color.GRAY);
leftPanel.setPreferredSize(SIDE_PANEL_DIMENSION);
DefaultListModel<SimpleTemplate> templatesListModel = new DefaultListModel<>();
templatesListModel.addElement(new SimpleTemplate("Template 1", "Description template 1", false));
templatesListModel.addElement(new SimpleTemplate("Template 2", "Description template 2", true));
templatesListModel.addElement(new SimpleTemplate("Template 3", "Description template 3", false));
templatesList.setCellRenderer(new JListRepositoryItem());
templatesList.addListSelectionListener(e-> displayTemplateInfo());
templatesList.setPreferredSize(TEMPLATES_LIST_DIMENSION);
templatesList.setModel(templatesListModel);
templatesList.repaint();
leftPanel.add(templatesList);
return leftPanel;
}
private void displayTemplateInfo() {
SimpleTemplate selectedValue = templatesList.getSelectedValue();
templateName.setText(selectedValue.getName());
templateDescription.setText(selectedValue.getDescription());
}
class JListRepositoryItem extends JCheckBox implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
setComponentOrientation(list.getComponentOrientation());
setFont(list.getFont());
setBackground(list.getBackground());
setForeground(list.getForeground());
if (value instanceof SimpleTemplate) {
SimpleTemplate template = (SimpleTemplate) value;
setSelected(isSelected);
setEnabled(list.isEnabled());
setText(template.getName());
}
return this;
}
}
class SimpleTemplate {
private String name;
private String description;
private boolean installed;
public SimpleTemplate(String name, String description, boolean installed) {
this.name = name;
this.description = description;
this.installed = installed;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isInstalled() {
return installed;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new CustomJListExample().setVisible(true));
}
}
将生成以下示例。
但是,我无法使Text具有自己的行为,而CheckBox也具有自己的行为。
如果要正确执行-由于选择行为是从那里来的,因此您必须更改JList
UI的实现。如果您从未使用过它,那将是一件非常困难的事情,但是您可以使用其他解决方法。