我正在使用具有自定义单元格渲染器的JList。这是单元格渲染器:
public class DefaultOriginalPublisherListRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof OriginalPublisher) {
OriginalPublisher op = (OriginalPublisher) value;
String text = op.getName();
if (index > -1) {
text = "<html><b>" + op.getName() + "</b><br/><small>" + op.getIpi() + "</small></html>";
}
return super.getListCellRendererComponent(list, text, index, isSelected, cellHasFocus);
} else {
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
}
它所做的就是在扩展列表时对文本进行一些更改。否则,它什么都不做。
应该添加的是,应用程序在运行应用程序的给定系统/操作系统下以默认的L&F运行。在我的系统上,默认的单元格渲染器为class javax.swing.plaf.synth.SynthComboBoxUI$SynthComboBoxRenderer
。那就是我要用上面的渲染器替换的单元渲染器。
渲染器应用于的JList如下所示。您可以看到高度比上面的组件小得多:
我想要的高度是这个。这是不使用单元格渲染器时的“默认”高度:
如何确保JList的高度(即使应用了自定义单元格渲染器)仍保持默认值?
这是SSCCE:
package test;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class CellRendererTest {
private final JFrame f;
public CellRendererTest() {
f = new JFrame();
init(f);
}
public void show() {
f.setPreferredSize(new Dimension(640, 480));
f.pack();
f.setVisible(true);
}
private void init(JFrame f) {
JPanel p = new JPanel();
f.add(p);
JComboBox defaultRendererCb = new JComboBox();
p.add(defaultRendererCb);
JComboBox customRendererCb = new JComboBox();
customRendererCb.setRenderer(new DefaultOriginalPublisherListRenderer());
p.add(customRendererCb);
DefaultComboBoxModel m = new DefaultComboBoxModel();
m.addElement(new OriginalPublisher("Test 1", "12345"));
m.addElement(new OriginalPublisher("Test 1", "67890"));
defaultRendererCb.setModel(m);
customRendererCb.setModel(m);
}
private class DefaultOriginalPublisherListRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof OriginalPublisher) {
OriginalPublisher op = (OriginalPublisher) value;
String text = op.getName();
if (index > -1) {
text = "<html><b>" + op.getName() + "</b><br/><small>" + op.getNumber() + "</small></html>";
}
return super.getListCellRendererComponent(list, text, index, isSelected, cellHasFocus);
} else {
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
}
private class OriginalPublisher {
private final String name;
private final String number;
public OriginalPublisher(String name, String number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public String getNumber() {
return number;
}
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
CellRendererTest t = new CellRendererTest();
t.show();
}
}