Невозможно изменить цвет Titlebar и JMenuBar
Я пытаюсь изменить либо цвет строки заголовка Windows, либо цвет JMenuBar. Я устанавливаю каждый внешний вид для Color.GREEN через UIManager.put( "XXXXXXX", Color.GREEN), где XXXXX - просто заполнитель. Большинство элементов меняются, но некоторые нет. Смотрите изображение для примера.
Красный - моя проблема (другие тоже странные, но все в порядке).
Сборка GUI с помощью построителя графического интерфейса NetBeans ( JFrame ->JMenuBar)
Спасибо за вашу помощь.
ОБНОВЛЕНИЕ Может быть, я должен упомянуть, что:
- Используется LAF "Windows"
- Используемая ОС: Windows 10
ОБНОВЛЕНИЕ РЕШЕНИЯ - ВРЕМЕННОЕ Хорошо, я получил кое-что работающее прямо сейчас (не могу проверить много сделаю позже). Я должен создать JFrame, прежде чем перейти на Windows LAF, это приводит к кадру, подобному @bhavna garg и @Ganesh Patel, затем я изменяю LAF на окна, и все другие элементы выглядят так, как я хотел. Цвета не правильные, и это нереальное решение, я думаю, но я проверю это позже
4 ответа
Я предпочитаю, чтобы вы могли использовать металлический внешний вид, где я могу изменить цвет строки заголовка, а также изменить цвет строки меню и меню.
Вот код:
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JRootPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.DefaultMetalTheme;
import javax.swing.plaf.metal.MetalLookAndFeel;
public class MyLookAndFeel {
JFrame frame;
JMenuBar menubar;
MetalLookAndFeel metal;
JMenu menu;
public MyLookAndFeel() {
metal = new MetalLookAndFeel();
metal.setCurrentTheme(new MetalTheme());
try {
UIManager.setLookAndFeel(metal);
}
catch(UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
frame = new JFrame("Hello");
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
menubar = new JMenuBar();
menubar.setOpaque(true);
menubar.setBackground(Color.green);
menu = new JMenu("File");
menubar.add(menu);
frame.setJMenuBar(menubar);
frame.setVisible(true);
frame.setSize(100,100);
}
public class MetalTheme extends DefaultMetalTheme {
@Override
public ColorUIResource getMenuBackground() {
return new ColorUIResource(Color.GREEN);
}
public ColorUIResource getWindowTitleBackground() {
return new ColorUIResource(java.awt.Color.green);
}
}
public static void main(String args[]) {
new MyLookAndFeel();
}
}
Смотрите для заголовка см. Это изображение Чтобы установить цвет заголовка используйте:
frame.getRootPane().setWindowDecorationStyle(5);
5 - это константа, которая придаст зеленый цвет менубару. Вы можете использовать числа от 1 до 8. Пример: 8 даст оранжевый цвет.
Чтобы установить цвет меню, используйте:
menubar.setBackground(Color.RED);
menubar.setOpaque(true);
Я перешел на JavaFX. Оригинальный концепт не сработал для меня, но спасибо за вашу помощь.
Я знаю, что немного опаздываю, но это может помочь другим:
Я обыскал весь Интернет, чтобы найти способ полностью изменить тему моего приложения на основе свинга. Затем я нашел статью об этом:
Кто-то может сказать:
Это невозможно. JFrame верхнего уровня управляется внешним видом базовой ОС.
Если вы хотите получить доступ к строке заголовка, сначала у вас должен быть доступ к собственным библиотекам движка Java. К счастью, есть способ:
Первый шаг: JNA предоставляет программам Java легкий доступ к собственным общим библиотекам без написания чего-либо, кроме кода Java. Таким образом, вы можете использовать этот репозиторий для доступа к ним: JNA.
Scroll down to readme and find the downloadable library.
Некоторые элементы могут откладываться в зависимости от используемой вами платформы. Поэтому убедитесь, что вы используете
jna-platform-5.8.0.jar
чтобы ваше приложение было совместимо с любыми платформами.
Второй шаг: если вы не знаете, как использовать библиотеки JNA, вы можете использовать это в качестве примера: пример
в любом случае, это может решить вашу проблему с цветом строки заголовка;)
Основная статья: Внешняя ссылка
Help me improve my writing in English by telling me my mistakes :D