Вопрос

У меня есть jcombobox, который должен быть отключен в какой -то момент, но я чувствую, что disabled Статус затрудняет чтение, потому что он имеет низкий контраст.

Было бы неплохо, если бы только кнопка «Стрелки» была бы показана как отключенная, сохраняя при этом визуализатор коробки, как если бы она была включена.

Действительный: actual combo Желанный: desired result

Есть ли простой способ достичь этого или чего -то подобного?

Спасибо!

Это было полезно?

Решение

Я закончил тем, что посмотрел на базовуюкомбобаксуи, где я нашел это:

        if ( comboBox.isEnabled() ) {
            c.setForeground(comboBox.getForeground());
            c.setBackground(comboBox.getBackground());
        }
        else {
            c.setForeground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledForeground", null));
            c.setBackground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledBackground", null));
        }

Итак, я использовал в качестве компонента рендерера jlabel с setForeground Метод переопределен, чтобы ничего не делать. Таким образом, цвет никогда не изменяется и сохраняет значение черного по умолчанию.

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

Может быть, тест может, по крайней мере, дать предупреждение, если установленный L & F или менеджер пользовательского интерфейса не звонит setForeground метод

Другие советы

Вот еще один вариант, который у вас есть:

    jComboBox1.setRenderer(new DefaultListCellRenderer() {
        @Override
        public void paint(Graphics g) {
            setForeground(Color.BLACK);
            super.paint(g);
        }
    });

Вам просто нужно добавить этот код после экземпляра. Буквы всегда останутся черными. Рамка со комбинированной коробкой станет как серым, либо черным, если вы отключите или включите.

Они выглядят так:

enter image description here

Вот еще один взлом, Из -за Майкла Граймса, что не должно влиять на конкретный внешний вид. Хитрость состоит в том, чтобы сделать комбо -коробку редактируемой; а JTextField который выставлен как редактор setDisabledTextColor метод А так как вы отключаете комбо -коробку, не имеет значения, что он редактируется! Код, который я использую для этого (переведен с Scala), является следующим:

JComboBox cb = ...;
...
cb.setEditable(true);
ComboBoxEditor editor = cb.getEditor()
JTextField     etf    = (JTextField)etf.getEditorComponent()
etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground"));
etf.setBackground(UIManager.getColor("ComboBox.background"));
// editor.setItem(format(obj));
cb.setEnabled(false);

Актерский состав гарантированно преуспевает здесь, потому что мы используем BasicComboBoxEditor, чьи документы говорят: «Редактор реализован как JTextfield». Комментированная линия происходит потому, что я использую пользовательский рендеринг, который печатает целые числа с дополнительным текстом, окружающим их; вызов setItem Позволяет мне указать аналогичную строку и необходима, потому что редактор игнорирует пользовательский рендер. Если вы используете рендеринг по умолчанию, то вам не нужно беспокоиться об этой строке; С другой стороны, если вы используете более сложный рендер, то вам может понадобиться сделать что -то еще полностью.

Несмотря на то, что это ужасающий Kludge, это работает, и, похоже, это не полагается на какие-либо функции, определяемые реализацией. Два места, которые я мог бы себе представить, - это (а), если редактируемый комбо -коробка выглядит сильно отличающимся от невозможного (например, моя первая попытка не изменила цвет фона текстового поля, что заставило его выглядеть неправильно) , или (b) если BasicComboBoxEditor остановил возвращение а JTextField (Что кажется менее вероятном). Но до сих пор это служит моим целям.

Попробуй это **

UIManager.put( "ComboBox.disabledBackground", new Color(212,212,210) );
UIManager.put( "ComboBox.disabledForeground", Color.BLACK );

**

Результат может быть достигнут с помощью следующего кода:

    Component editorComponent = comboBox.getEditor().getEditorComponent();
    if(editorComponent instanceof JTextComponent){
        ((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
    }

Я не проверял его с несколькими L & F, но это может иметь значение, так как это запускает событие PropertyChange («DisabledTextColor»). Пожалуйста, посмотрите док.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top