Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改JMenuBar及其内部JMenu对象的背景和文本颜色_Java_Swing_Look And Feel_Jmenu_Jmenubar - Fatal编程技术网

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

}