什么是Swing - 相当于HTML <optgroup>

Zak*_*hol 10 java swing combobox optgroup

我希望我的JComboBox将多个选项组合在一起,类似于HTML optgroup:

<select>  
 <optgroup label="A">  
  <option/>
  <option/>  
 </optgroup>
</select>  
Run Code Online (Sandbox Code Playgroud)

我在Swing找不到任何解决方案.操作Combobox的UI-Renderer似乎是一个坏主意,因为它依赖于操作系统和L&F(它们是私有的,因此无法扩展).

n0w*_*eak 14

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


tra*_*god 7

您可以在自定义渲染器中执行此操作,如如何使用组合框:提供自定义渲染器中所述.


Dav*_*e G 5

我不相信有一种简单的方法可以做到这一点,但有一种方法可以做到这一点.

我将实现一个数据模型类,指出您在上面描述的分组.将这些数据模型的实例放在javax.swing.ComboBoxModel实现实例中.

然后,您可以使用javax.swing.ListCellRenderer实现格式化输出,并使用文本数据的缩进.您可能只想扩展javax.swing.DefaultListCellRenderer或者可能从Java源中借用其实现批发.

至于L&F,你应该能够通过使用上述方法保持在正常的指导范围内,你不必为了弄清楚如何实现它而斗争.查看默认的Swing组件,他们将提供有关如何处理L&F的大量见解.

另外,我认为有一些机制(你必须原谅我,自从我完成完整的Swing开发以来已经过了几年),以便让你确定一个项目是否可选.