Почему мой Combobox не обновляет свой цвет должным образом? - PullRequest
0 голосов
/ 09 октября 2019

Я внедряю темный режим в свою программу, и все работает отлично, кроме Combobox, который не хочет менять свой цвет так, как я хочу.

1

Итак, как вы можете видеть, всплывающее окно Combobox просто меняет цвет, а само Combobox - нет. Также меняется цвет переднего плана Combobox, но фон не меняется.

Думаю, проблема может возникнуть из-за внешнего вида.

В моем основном классе:

UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

Где я изменяю на Darkmode:

TeamInterface.userFilterComboBox.setBackground( darkBackgroundColor );
TeamInterface.userFilterComboBox.setForeground( fontColor );
SwingUtilities.updateComponentTreeUI( TeamInterface.userFilterComboBox );

Я должен использовать метод updateComponentTreeUI, потому что в противном случае «всплывающее окно» также остается белым. Если я уберу внешний вид и ощущение в своем основном классе, комбинированный список выглядит хорошо, как вы можете видеть на этой картинке,

2

, но я не хочу избавлятьсявнешнего вида системы, поэтому я попытался вручную отредактировать пользовательский интерфейс комбинированного списка в металле с помощью этого кода:

userFilterComboBox.setUI( new MetalComboBoxUI() );

, но .. результат просто ужасен, даже теоретически (в некоторых случаяхЯ думаю) это должно выглядеть так же, как без внешнего вида

3

1 Ответ

0 голосов
/ 10 октября 2019

Combobox не является компонентом только для фона и переднего плана, но является сложным компонентом. Пример: JComboBox состоит из:

  • ArrowButton
  • Список элементов
  • Граница (и она имеет цвет)
  • выбранный элемент

Таким образом, для изменения всего, что вы можете добавить в свой UIManager, все константы или вы можете определить новый UIComponent.

Таким образом, PersonalComboBoxUI может выполнять следующие действия:

/**
 * @contributor https://github.com/vincenzopalazzo
 */
public class PersonalComboBoxUI extends BasicComboBoxUI {

    public static ComponentUI createUI (JComponent c) {
        return new PersonalComboBoxUI ();
    }

    @Override
    public void installUI (JComponent c) {
        super.installUI (c);

        JComboBox<?> comboBox = (JComboBox<?>) c;
        comboBox.setBackground (UIManager.getColor ("ComboBox.background"));
        comboBox.setForeground (UIManager.getColor ("ComboBox.foreground"));
        comboBox.setBorder (UIManager.getBorder ("ComboBox.border"));
        comboBox.setLightWeightPopupEnabled (true);
    }

    @Override
    protected JButton createArrowButton () {
        Icon icon = UIManager.getIcon ("ComboBox.buttonIcon");
        JButton button;
        if (icon != null) {
            button = new JButton (icon);
        }
        else {
            button = new BasicArrowButton (SwingConstants.SOUTH);
        }
        button.setOpaque (true);
        button.setBackground (UIManager.getColor ("ComboBox.buttonBackground"));
        button.setBorder (BorderFactory.createLineBorder(Color.black));
        return button;
    }

    @Override
    protected ListCellRenderer createRenderer() {
        return new MaterialComboBoxRenderer();
    }
}

Вы должны быть определены также PersonalComboBoxRenderer

/**
 * @contributor https://github.com/vincenzopalazzo
 */
    public class PersonalComboBoxRenderer extends BasicComboBoxRenderer {

        @Override
        public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JComponent component = (JComponent) super.getListCellRendererComponent (list, value, index, isSelected, cellHasFocus);

            component.setBorder (BorderFactory.createEmptyBorder (5, 5, 5, 5));
            component.setForeground (UIManager.getColor ("ComboBox.foreground"));
            component.setBackground (isSelected || cellHasFocus ?
                    UIManager.getColor("ComboBox.selectedInDropDownBackground") :
                    UIManager.getColor("ComboBox.background"));

            return component;
        }
    }

ps: в этом случае я использую UIManager.put ("ComboBox.background", COLOR) для добавления истратификация внутри JComponent.

Поэтому я хочу добавить две информации относительно того, используете ли вы персональный цвет внутри UIManager или PersonalComboBoxUI, цвет должен быть определен с помощью этого кода

Color PINK_400 = new ColorUIResource (236, 64, 122);

, потому что когдаВы идете, чтобы удалить внешний вид, и цвет не может быть удален, но если вы использовали ColorUIResource , внешний вид и внешний вид должны быть удалены правильно.

Для завершения, если вам не нужны настройки по умолчаниюпосмотри ичувствую, я хочу предложить вам использовать библиотеку.

material-UI-swing имеет системную тематику для создания персонального времени в вашем приложении, и вся тема персонализирована.

Это репо vincenzoapalazzo / material-ui-swing и atarw / material-ui-swing являются одним и тем же хранилищем и одним и тем же разработчиком, так что vincenzopalazzo/ material-us-swing - это ветка разработчика, содержащая дополнительные исправления и тесты.

Пример библиотеки:

OcenicTheme.

Ps: Я - дизайнер MaterialTheming System .

...