У меня есть приложение, управляющее оборудованием, в котором отображается JDialog, когда пользователь хочет получить «черный ход» к оборудованию. Этот JDialog наполнен кнопками и функциями, и я не хочу увеличивать его размер, особенно по вертикали. Я хочу добавить предупреждающий текст, чтобы некоторых новых пользователей предупреждали не играть с кнопками, поскольку неправильные действия могут повредить оборудование. Добавление диалога, который пользователь должен закрыть, не является вариантом.
В заголовке есть место, которое я хотел бы использовать, поэтому я обновил его следующим образом: Это круто, но я хотел бы подчеркнуть это, раскрасив текст предупреждения в красный цвет, вот так: Я пробовал использовать теги HTML, которые работают в JLabel, но метод setTitle() не распознает их и просто помещает в заголовок.
Я хотел использовать значок, поэтому создал длинный прямоугольник с красным текстом и вызвал setIconImage(): Значок есть, но его размер изменен до квадрата. (Посмотрите вверху слева. Я засмеялся, затем вздохнул)
Единственное решение, которое я смог найти в Интернете, - это создать свой собственный LookAndFeel, в который я не хотел вдаваться, поскольку он кажется излишним для простого красного текста.
Есть ли способ манипулировать текстом в заголовке, аналогичный тому, что вы можете сделать с JLabel?
Раньше я думал об использовании этого пространства заголовка для часто используемых элементов управления, но не мог понять, как это сделать. Например, в Microsoft Excel теперь есть значок «Сохранить» и текстовое поле поиска в электронной таблице. (Есть ли в Javafx эта функция?)
Другой вариант — включить предупреждение в заголовок JLabel.
@GilbertLeBlanc Да, это было бы типичное решение. Но это увеличит вертикальный размер панели на высоту JLabel. Как я сказал выше, я не хочу этого делать, потому что в моем случае панель уже занимает вертикальное пространство монитора, подключенного к моему оборудованию, и я не хочу, чтобы пользователю приходилось прокручивать.




Когда приложение отображает окно, оно сообщает операционной системе: «Я хочу отобразить окно с этим содержимым и с этим заголовком».
Затем операционная система создает строку заголовка и элементы управления окнами (закрыть, свернуть, развернуть и меню управления окнами). Не только приложения Java работают таким образом; программы, написанные на любом языке, также должны создавать окна таким же образом.
Поскольку строку заголовка рисует операционная система, а не Java, невозможно заставить ее отображать цвета.
Даже индивидуальный внешний вид не позволит вам этого сделать по той же причине: Java не рисует строку заголовка.
Один из вариантов — создать недекорированный Фрейм: фрейм, который сообщает операционной системе: «У меня есть заголовок, но я не хочу, чтобы система вообще его показывала».
Конечно, это будет означать отсутствие строки заголовка и элементов управления окнами. Так что вам придется нарисовать их самостоятельно. Это не так просто, как кажется, потому что ваше окно будет выглядеть странно и по-другому, если вы не будете внимательно следить за настройками системы, включая текущую тему, размеры шрифта и масштабирование HiDPI. Вам придется нарисовать (и масштабировать) значок приложения. Вам придется правильно отображать текст заголовка, даже если для него недостаточно места по горизонтали. И просто добавить кнопки «Свернуть», «Развернуть» и «Закрыть» недостаточно; вам нужно будет эмулировать поведение, когда пользователь нажимает на значок; когда пользователь щелкает правой кнопкой мыши, средней кнопкой мыши или дважды щелкает строку заголовка; когда пользователь перетаскивает окно; и когда пользователь перетаскивает окно ближе к краю экрана.
Учитывая всю работу, необходимую для эмуляции правильной строки заголовка, я бы предпочел вместо этого добавить красный баннер вверху обычного фрейма.
Вы также спросили: «Теперь в Microsoft Excel есть значок «Сохранить» и текстовое поле поиска в электронной таблице. (Есть ли в Javafx такая функция?)» Ответ таков: теоретически она есть: JavaFX позволяет вам указать стиль сцены , которым является StageStyle.UNIFIED. Предполагается, что это даст вам «унифицированную строку заголовка» — это означает, что строка заголовка не является отдельной областью над содержимым окна, а скорее сцена окна перекрывает строку заголовка.
Однако я не могу заставить его работать в Windows 10 или 11, а Platform.isSupported(ConditionalFeature.UNIFIED_WINDOW) возвращает false в Linux/Gnome. Параметр игнорируется в обоих случаях. У меня нет возможности проверить это в OSX.
Поэтому даже при использовании JavaFX я бы выбрал красный баннер в самом верху области содержимого окна. Строки заголовков не поддавались настройке (кроме запрета элементов управления свертыванием/развертыванием) почти с тех пор, как существуют приложения с графическим интерфейсом.
Спасибо. Вы очень красноречиво обобщили большую часть того, что я нашел, а также добавили информацию о Javafx. Я собираюсь отказаться от требования к цвету и перейти ко всем остальным вещам, которые мне нужно сделать. Вы получаете приз в виде галочки, технически это не решило проблему, но предотвратило потерю времени.
Альтернативно, вы можете разместить полупрозрачное дочернее окно над строкой заголовка и рисовать в нем все, что захотите. Однако в таком случае задача состоит в том, чтобы правильно разместить ее, не делая предположений о внешнем виде системы.
Строка заголовка является частью ОС LAF и не поддерживает стилизованный текст. Вы можете использовать недеформированный диалог и создать собственную строку заголовка. Тогда вы будете полностью контролировать заголовок и отображаемые компоненты. Конечно, вам также необходимо будет написать всю функциональность для ваших пользовательских компонентов.