什么是Swing等效于HTML
发布于 2021-01-30 17:50:23
我希望我的JComboBox将多个选项组合在一起,类似于HTML
optgroup
:
<select>
<optgroup label="A">
<option/>
<option/>
</optgroup>
</select>
我在Swing中找不到任何解决方案。为Combobox操纵UI渲染器似乎不是一个好主意,因为它依赖于OS和L&F(并且它们是私有的,因此无法扩展)。
关注者
0
被浏览
90
1 个回答
-
考虑以下实现作为如何应用自定义样式和创建不可选择项目的基本指南:
public class ExtendedComboBox extends JComboBox { public ExtendedComboBox() { setModel(new ExtendedComboBoxModel()); setRenderer(new ExtendedListCellRenderer()); } public void addDelimiter(String text) { this.addItem(new Delimiter(text)); } private static class ExtendedComboBoxModel extends DefaultComboBoxModel { @Override public void setSelectedItem(Object anObject) { if (!(anObject instanceof Delimiter)) { super.setSelectedItem(anObject); } else { int index = getIndexOf(anObject); if (index < getSize()) { setSelectedItem(getElementAt(index+1)); } } } } private static class ExtendedListCellRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (!(value instanceof Delimiter)) { return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } else { JLabel label = new JLabel(value.toString()); Font f = label.getFont(); label.setFont(f.deriveFont(f.getStyle() | Font.BOLD | Font.ITALIC)); return label; } } } private static class Delimiter { private String text; private Delimiter(String text) { this.text = text; } @Override public String toString() { return text.toString(); } } }