Java 更改JMenuBar及其内部JMenu对象的背景和文本颜色
如何为Java 更改JMenuBar及其内部JMenu对象的背景和文本颜色,java,swing,look-and-feel,jmenu,jmenubar,Java,Swing,Look And Feel,Jmenu,Jmenubar,如何为JMenuBar和JMenu中的对象设置自定义背景色?我尝试了.setBackgroundColor,但它不起作用 创建一个扩展JMenuBar的新类: public class BackgroundMenuBar extends JMenuBar { Color bgColor=Color.WHITE; public void setColor(Color color) { bgColor=color; } @Override
JMenuBar
和JMenu
中的对象设置自定义背景色?我尝试了.setBackgroundColor
,但它不起作用 创建一个扩展JMenuBar
的新类:
public class BackgroundMenuBar extends JMenuBar {
Color bgColor=Color.WHITE;
public void setColor(Color color) {
bgColor=color;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(bgColor);
g2d.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
}
}
现在,您使用该类而不是
JMenuBar
,并使用setColor()
设置背景色,您可能需要更改菜单项的不透明度,即:
JMenuItem item= new JMenuItem("Test");
item.setOpaque(true);
item.setBackground(Color.CYAN);
您还可以使用UIManager
在全局范围内实现这一点,例如:
UIManager.put("MenuItem.background", Color.CYAN);
UIManager.put("MenuItem.opaque", true);
最简单的方法(我能想到)是更改UIManager
使用的默认值。这将影响应用程序中的所有菜单栏和菜单项,尽管
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestMenuBar {
public static void main(String[] args) {
new TestMenuBar();
}
public TestMenuBar() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
UIManager.put("MenuBar.background", Color.RED);
UIManager.put("Menu.background", Color.GREEN);
UIManager.put("MenuItem.background", Color.MAGENTA);
JMenu mnu = new JMenu("Testing");
mnu.add("Menu Item 1");
mnu.add("Menu Item 2");
JMenuBar mb = new JMenuBar();
mb.add(mnu);
mb.add(new JMenu("Other"));
JFrame frame = new JFrame("Test");
frame.setJMenuBar(mb);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
我的只有在我改变时才起作用:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
致:
否则,颜色保持不变。简单的方法是通过
.setBackground(Color.RED)
和设置不透明(true)
menubar.setBackground(颜色:红色);
菜单.背景(颜色.黄色);
menubar.set不透明(true);
menu.setOpaque(true)代码>
这将为菜单栏和菜单提供您选择的颜色。非常简单
代码如下:
menu.setBackground(Color.DARK_GRAY);
同样,您可以添加自己的颜色,如绿色、蓝色、深灰色、浅灰色、黑色、红色等
这是在java中更改任何组件颜色的唯一简单方法
注意:这仅适用于Java Swing中的所有组件。它在JavaFX、JFace、SWT中是无用的,但在AWT和Swing中不是
谢谢,
德里克·史密斯
public void run() {
UIManager.put("MenuBar.background", new java.awt.Color(255, 245, 157));
UIManager.put("MenuBar.opaque", true);
UIManager.put("Menu.background", new java.awt.Color(255, 245, 157));
UIManager.put("Menu.opaque", true);
UIManager.put("MenuItem.background",new java.awt.Color(255, 245, 157));
UIManager.put("MenuItem.opaque", true);
new MenuPrincipal().setVisible(true);
}
菜单栏不改变颜色,但其余的(菜单和菜单项)问题可能与LAF有关。使用默认LAF,您只需设置菜单栏的背景,菜单将继承此颜色,因为它是非不透明的。发布您的SSCCE以演示问题。如果你不知道SSCCE是什么,你可以一直在网上搜索。对,出于某种原因,Nimbus L&AFO同意,这对JMenu不再起作用(至少在Mac上),JMenu保留默认的白色,直到你使用上面建议的getCrossPlatformLookAndFeelClassName()
,这打破了所有GUI平台设计。。e、 丑陋的文件选择器everywhere@Jiří考虑到这是7年前的事实,我并不感到惊讶,我也不感到惊讶,但即使是今天,这也是我需要解决的问题(我认为我并不孤单),因此值得让事情保持最新。。。要绘制菜单项,请设置.setOpaque(false)
并在后面绘制JMenuBar(覆盖paintComponent()
)不要忘记将JMenu上的不透明设置为false以强制继承颜色,因为这是我在Mac上唯一不使用丑陋的UIManager的操作。getCrossPlatformLookAndFeelClassName()
,有趣的是Linux和Windows都很好,可能是因为它们不使用AquaMenuUI
public void run() {
UIManager.put("MenuBar.background", new java.awt.Color(255, 245, 157));
UIManager.put("MenuBar.opaque", true);
UIManager.put("Menu.background", new java.awt.Color(255, 245, 157));
UIManager.put("Menu.opaque", true);
UIManager.put("MenuItem.background",new java.awt.Color(255, 245, 157));
UIManager.put("MenuItem.opaque", true);
new MenuPrincipal().setVisible(true);
}