@Ordnungswidrig: Интересная мысль - я добавил опровержение в ваш ответ, так как думал, что это важная идея.

я есть приложение, которое использует отключенные JTextFields в нескольких местах, которые должны быть прозрачными - позволяя фону просвечивать вместо обычного фона текстового поля.

При запуске нового Nimbus LAF эти поля непрозрачны (несмотря на установку setOpaque (false)), и мой пользовательский интерфейс не работает. Это как если бы LAF игнорирует непрозрачное свойство. Установка цвета фонаявно затруднительно в нескольких местах и ​​менее оптимально из-за фоновых изображений на самом деле не работает - он по-прежнему закрашивает свой фон по умолчанию LAF сверху, оставляя вид, похожий на рамку (на заставке ниже фон явно установлен в соответствии с изображением)

Любые идеи о том, как я могу заставить Nimbus не рисовать фон для JTextField?

Примечание: мне нужен JTextField, а не JLabel, потому что мне нужен потокобезопасный setText () и возможность обтекания.

Примечание: моя запасная позиция - продолжать использовать систему LAF, но Nimbus выглядит значительно лучше.

Смотрите пример изображения ниже.

Выводы

сюрприз это происходит из-за неправильной интерпретации того, что setOpaque () должен делать - из сообщения об ошибке Nimbus:

Это проблема оригинального дизайна Swing и его запутанности в течение многих лет. Проблема в том, что setOpaque (false) имеет побочный эффект при выходе из LAF, который заключается в сокрытии фона, который на самом деле не предназначен для этого. Следует сказать, что компонент my может иметь прозрачные части, и Swing должен закрасить родительский компонент позади него.

К сожалению, компоненты Nimbus также не соответствуют setBackground (null), который в противном случае был бы рекомендованным способом остановки рисования фона. Установка полностью прозрачного фона кажется мне не интуитивно понятным.

На мой взгляд, setOpaque () / isOpaque () является ошибочным публичным выбором API, который должен был быть только:

public boolean isFullyOpaque();

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

Таким образом, непрозрачность компонента не должна быть установлена ​​с помощью setOpaque (). Вместо этого что-то вроде setBackground (null) должно привести к тому, что многие компоненты «не имеют фона» и, следовательно, станут не полностью непрозрачными. Например, в идеальном мире большинство компонентов должны иметь isOpaque (), который выглядит следующим образом:

public boolean isOpaque() { return (background!=null); }

Ответы на вопрос(1)

Ваш ответ на вопрос