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