@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); }