【问题标题】:Change JComboBox colours WITHOUT renderer在没有渲染器的情况下更改 JComboBox 颜色
【发布时间】:2011-07-27 12:20:30
【问题描述】:

我可以使用以下方法更改组合框的背景颜色:

UIManager.put("ComboBox.background", Color.RED);

它有效。

但是要改变[selected].background,看看Nimbus Defaults这个属性叫做ComboBox:"ComboBox.listRenderer"[Selected].background ,所以我尝试了:

UIManager.put("ComboBox:\"ComboBox.listRenderer\"[Selected].background", Color.RED);

但它不起作用。

我想用一个渲染器来做到这一点(我已经尝试过并且在我自己没有编写的长代码中给出了很多问题,如果我这样做的话,将组合框渲染到 JFileChoosers 是一个额外的问题)。那么,有什么解决方案可以使用 UIMAnager.put() 来解决这个问题吗?

【问题讨论】:

    标签: java swing combobox nimbus uimanager


    【解决方案1】:

    设置不同的Color,不使用Nimbus defaluts

    1/ 用于单独的 JComboBox

    ((JTextField) myJComboBox.getEditor().getEditorComponent())
    #setBackground(Color.xxxx);
    

    2/ 用于 JFileChooser

    • 按照建议的here,从JFileChooser(复合JComponents)中提取所有JComponents,方法与JListJScrooPane中描述的相同

    • 最安全的方法是从JFileChooser 中提取所有JComponents,正如您之前关于here 的帖子中所建议的那样

    3/ 使用NimbusDefalut 查找默认值

    • JTextField 并在我的 add No.1 中建议

    • JComboBox's DropDown List 来自JList 的默认值,HighLighter 用于从JTable 中选择

    编辑:

    代码

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.plaf.basic.BasicComboPopup;
    
    public class DisabledEditableCombo extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private String comboList[] = (new String[]{"-", "London", "New York", "Sydney", "Tokyo"});
        private JComboBox cmb = new JComboBox(comboList);
        private JComboBox cmb1 = new JComboBox(comboList);
        private JComboBox cmb2 = new JComboBox(comboList);
        private JComboBox cmb3 = new JComboBox(comboList);
        private JList list;
        private JCheckBox checkBox = new JCheckBox("Combo enabled", false);
    
        public DisabledEditableCombo() {
            JLabel lbl = new JLabel("Editable JComboBox");
            cmb.setEditable(true);
            ((JTextField) cmb.getEditor().getEditorComponent()).setDisabledTextColor(Color.red);
            ((JTextField) cmb.getEditor().getEditorComponent()).setBackground(Color.green);
            cmb.setSelectedItem("Just Editable");
            JLabel lbl1 = new JLabel("Non-Editable JComboBoxes");
            //UIManager.put("ComboBox.disabledForeground", Color.red.darker().darker());
            cmb1.setSelectedItem("Sydney");
            cmb1.setRenderer(new DefaultListCellRenderer() {//  ListCellRenderer
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public void paint(Graphics g) {
                    setBackground(cmb1.getBackground());
                    setForeground(Color.red);
                    super.paint(g);
                }
            });
            cmb2.getEditor().getEditorComponent().setForeground(Color.blue);
            ((JTextField) cmb2.getEditor().getEditorComponent()).setDisabledTextColor(Color.red);
            cmb2.setSelectedItem("London");
            cmb3.setSelectedItem("Sydney");
            checkBox.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    boolean selected = checkBox.isSelected();
                    cmb.setEnabled(selected);
                    cmb1.setEnabled(selected);
                    cmb2.setEnabled(selected);
                    cmb2.setEditable(!cmb2.isEnabled());
                    cmb2.setForeground(selected ? Color.blue : Color.red);
                    if (cmb2.getEditor() != null) {
                        ((JTextField) cmb2.getEditor().getEditorComponent()).setDisabledTextColor(Color.red);
                    }
                    cmb3.setEnabled(selected);
                    Object child = cmb3.getAccessibleContext().getAccessibleChild(0);
                    BasicComboPopup popup = (BasicComboPopup) child;
                    list = popup.getList();
                    if (list != null) {
                        if (selected) {
                            list.setForeground(Color.blue);
                        } else {
                            list.setForeground(Color.red);
                        }
                    }
                }
            });
            cmb.setEnabled(false);
            cmb1.setEnabled(false);
            cmb2.setEnabled(false);
            cmb3.setEnabled(false);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(300, 300));
            setLocation(150, 100);
            setLayout(new GridLayout(7, 0, 10, 10));
            add(lbl);
            add(cmb);
            add(lbl1);
            add(cmb1);
            add(cmb2);
            add(checkBox);
            add(cmb3);
            pack();
            setVisible(true);
        }
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    DisabledEditableCombo disabledEditableCombo = new DisabledEditableCombo();
                }
            });
        }
    }
    

    【讨论】:

    • 到目前为止,我尝试使用解决方案 #1,但出现错误。将 '#' 更改为 '.'它去了,但没有任何改变。无论如何,寻找改变背景,而不是选择的背景
    • 问题是第一个不起作用,第二个告诉我使用上一个问题中的代码,它应该只修复 FileChooser 上的 JComboBox 而不是其余的,第三个我只是不'不明白你要我做什么。最后,我也不明白您编辑后添加的代码:它旨在替换 FileChooser 之外的 JComboBox?是否经过测试?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2014-11-16
    • 2017-09-24
    相关资源
    最近更新 更多