Лучшая читаемость / контрастность в отключенном JComboBox - PullRequest
10 голосов
/ 28 января 2011

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

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

Факт: actual combo Желательно: desired result

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

Спасибо!

Ответы [ 5 ]

7 голосов
/ 28 января 2011

В итоге я заглянул в BasicComboBoxUI, где нашел следующее:

        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, переопределенным, чтобы ничего не делать. Таким образом, цвет никогда не изменяется и сохраняет значение черного по умолчанию.

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

Возможно, тест мог бы хотя бы выдать предупреждение, если установленный L & F или UI Manager не вызывает метод setForeground.

6 голосов
/ 23 июля 2011

Вот еще один взлом, из-за Майкла Граймса , на который не должен влиять конкретный внешний вид.Хитрость заключается в том, чтобы сделать поле со списком редактируемым;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 позволяет мне указать похожую строку и необходим, потому что редактор игнорирует пользовательский рендер.Если вы используете рендерер по умолчанию, вам не нужно беспокоиться об этой строке;с другой стороны, если вы используете более сложное средство рендеринга, вам может потребоваться сделать что-то еще полностью.

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

6 голосов
/ 28 января 2011

Вот еще один вариант:

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

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

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

enter image description here

4 голосов
/ 08 августа 2012

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

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

**

0 голосов
/ 25 апреля 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...