Java: Swing: Nimbus: редактируемое поле JComboBox выглядит иначе, чем не редактируемое поле

#java #swing #jcombobox #look-and-feel #nimbus

#java #swing #jcombobox #внешний вид #nimbus

Вопрос:

Первый JComboBox доступен для редактирования и выглядит нормально с его TitledBorder . Но второй не редактируемый JComboBox выглядит странно. Все JComboBoxes содержат перечисления, поэтому они не должны быть редактируемыми, но они должны иметь приятный внешний вид редактируемого JComboBox. Как я могу этого добиться? Я использую Nimbus.

редактируемое и не редактируемое поле

Редактировать

Может быть, это связано с настройками, которые я выбираю для Nimbus? Это настройки:

      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

Нет, это не имеет отношения к настройкам Nimbus:

введите описание изображения здесь

Ответ №1:

Вот как это выглядит на моей Windows 10 (64-разрядной) машине с Oracle JDK 15

Nimbus00

Вот код.

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

Комментарии:

1. Спасибо. Я должен попробовать это с моими настройками Nimbus.

2. Еще раз спасибо. Причина проблемы заключалась в том, что я установил границу непосредственно в поле со списком, а не так, как вы на jpanel, окружающей его.

Ответ №2:

Причина в том, что я устанавливаю границу непосредственно на JComboBox, а не на JPanel, окружающей его.

введите описание изображения здесь