Search code examples
javaswingjcomboboxlook-and-feelnimbus

Java:Swing:Nimbus:JComboBox editable box looks different from not editable box


The first JComboBox is editable and looks fine with its TitledBorder. But the second not editable JComboBox looks strange. All the JComboBoxes contain Enums, therefore they should not be editable but they should have the nice look of the editable JComboBox. How can I achieve that? I am using Nimbus.

editable and not editable box

EDIT

Maybe it has to do with the settings I choose for Nimbus? These are the settings:

     NimbusLookAndFeel nimbus = new NimbusLookAndFeel();
     UIManager.setLookAndFeel(nimbus);
     UIManager.put("control", Settings.getTexturedBackgroundColor());
     UIManager.put("nimbusBlueGrey", Settings.getLightGrayGold());
     UIManager.put("nimbusBase", Settings.getDarkGold());
     UIManager.put("textForeground", Color.BLACK);
     UIManager.put("nimbusFocus", new Color(255, 220, 35));
     UIManager.put("ToolBar:Button.contentMargins",
           new Insets(5, 15, 5, 15));
     UIManager.put("TextField.background", Settings.getLightYellow());
     UIManager.put("ComboBox.forceOpaque", false);
     UIManager.put("TitledBorder.border", new Insets(10, 10, 10, 10));
     UIManager.put("TitledBorder.position", TitledBorder.ABOVE_BOTTOM);
     UIManager.put("TitledBorder.font", getGermanFont(16F));
     UIManager.put("TitledBorder.titleColor", Color.GRAY);
     UIManager.put("Table.opaque", false);
     UIManager.put("List.opaque", false);
     UIManager.put("Table.cellRenderer", false);
     UIManager.put("OptionPane.buttonFont", Main.getGermanFont(16F));

EDIT2

No, it does not have to do with the Nimbus settings:

enter image description here


Solution

  • This is how it looks on my Windows 10 (64 bit) machine with Oracle's JDK 15

    Nimbus00

    Here is the code.

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    
    import javax.swing.BorderFactory;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.WindowConstants;
    import javax.swing.border.TitledBorder;
    
    public class Nimbus00 {
        private JFrame  frame;
    
        private JPanel createEditableCombo() {
            JPanel panel = new JPanel();
            panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
                                                             "Editable",
                                                             TitledBorder.LEADING,
                                                             TitledBorder.BOTTOM));
            Object[] items = new Object[]{"One",
                                          "Two",
                                          "Three",
                                          "Four",
                                          "Five",
                                          "Six",
                                          "Seven",
                                          "Eight",
                                          "Nine",
                                          "Ten"};
            JComboBox<Object> combo = new JComboBox<>(items);
            combo.setEditable(true);
            panel.add(combo);
            return panel;
        }
    
        private JPanel createNonEditableCombo() {
            JPanel panel = new JPanel();
            panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(),
                                                             "Regular",
                                                             TitledBorder.LEADING,
                                                             TitledBorder.BOTTOM));
            Object[] items = new Object[]{"First",
                                          "Second",
                                          "Third",
                                          "Fourth",
                                          "Fifth",
                                          "Sixth",
                                          "Seventh",
                                          "Eighth",
                                          "Ninth",
                                          "Last"};
            JComboBox<Object> combo = new JComboBox<>(items);
            combo.setPrototypeDisplayValue("WWWWWWWWWW");
            panel.add(combo);
            return panel;
        }
    
        private void showGui() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.add(createEditableCombo(), BorderLayout.PAGE_START);
            frame.add(createNonEditableCombo(), BorderLayout.PAGE_END);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
            }
            catch (ClassNotFoundException |
                   IllegalAccessException |
                   InstantiationException |
                   UnsupportedLookAndFeelException x) {
                x.printStackTrace();
            }
            EventQueue.invokeLater(() -> new Nimbus00().showGui());
        }
    }