什么是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 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    考虑以下实现作为如何应用自定义样式和创建不可选择项目的基本指南:

    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();
            }
        }
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看