如何将JMenuBar放在mac的顶部并更改JButton的背景

时间:2015-09-21 10:21:26

标签: java macos swing jmenubar

我正在用java构建一个Mac桌面应用程序。我想改变JButton的背景,并且我想让我的JMenuBar位于顶部。

为了将我的JMenuBar放在顶部,我添加了以下代码:

  System.setProperty("apple.laf.useScreenMenuBar", "true");
  System.setProperty(
      "com.apple.mrj.application.apple.menu.about.name", "Stack");

它有效!

为了改变我使用的背景颜色:

    JButton b = new JButton("press me!");

    b.setBackground(Color.blue);

    b.setContentAreaFilled(false);
    b.setOpaque(true);
    b.setBorderPainted(true);
    try {
        UIManager.setLookAndFeel(UIManager
                .getCrossPlatformLookAndFeelClassName());
    } catch (Exception e) {

    }

它也有效!

问题在于,当我改变颜色时,JMenuBar不在顶部。经过一些调试后,我知道更改LookAndFeel是负责任的。

完整的代码:

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.UIManager;

public class Main {
    public static void main(String[] args) {    
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        System.setProperty(
          "com.apple.mrj.application.apple.menu.about.name", "Stack");

        JButton b = new JButton("press me!");           
        b.setBackground(Color.blue);    
        b.setContentAreaFilled(false);
        b.setOpaque(true);
        b.setBorderPainted(true);
        try {
            UIManager.setLookAndFeel(UIManager
                    .getCrossPlatformLookAndFeelClassName());
        } catch (Exception e) {

        }   
        JFrame f = new JFrame();            
        f.add(b);           
        JMenuBar m = new JMenuBar();            
        m.add(new JMenu("item"));   
        f.setJMenuBar(m);
        f.setVisible(true);         
        f.setVisible(true);
    }
}

因此,此代码更改了按钮的颜色,但JMenuBar不在顶部。如果您对try中的行进行注释,它将不会更改颜色,但会将JMenuBar置于顶部。

任何帮助??

提前致谢!

2 个答案:

答案 0 :(得分:1)

我通过添加行

解决了这个问题
b.setUI(new MetalButtonUI());

并删除try catch。

最终看起来像这样:

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.UIManager;
import javax.swing.plaf.metal.MetalButtonUI;

public class Main {

    public static void main(String[] args) {

        System.setProperty("apple.laf.useScreenMenuBar", "true");
        System.setProperty("com.apple.mrj.application.apple.menu.about.name",
                "Stack");
        JButton b = new JButton("press me!");

        b.setBackground(Color.blue);

        b.setContentAreaFilled(false);
        b.setOpaque(true);
        b.setBorderPainted(true);
        b.setUI(new MetalButtonUI());


        JFrame f = new JFrame();

        f.add(b);



        f.setBounds(0, 0, 500, 500);
        JMenuBar m = new JMenuBar();

        m.add(new JMenu("item"));



        f.setJMenuBar(m);
        f.setVisible(true);

        f.setVisible(true);
    }
}

答案 1 :(得分:0)

您可以尝试使用JMenu和JMenuItem。通过这种方式,您可以使用多个菜单项'菜单:

....

menubar = new JMenuBar();

menu1 = new JMenu();

menuItem1 = new JMenuItem("item 1");

// add menu item to menu
menu1.add(menuItem1);

// add menu to menubar
menubar.add(menu1);

....