如何在JMenu和JMenuItems中取出白色边框

时间:2015-12-24 23:22:04

标签: java swing jmenu jmenuitem jmenubar

我正在使用Swing进行此图形界面。我遇到的问题是我不能采用JMenuItems周围的白色边框,并将其全部涂成黑色。这是一张图片:

enter image description here

我想像这样画(我用油漆编辑了图像:D):

enter image description here

有人可以帮助我吗?我会感激任何帮助。谢谢!

2 个答案:

答案 0 :(得分:6)

我刚刚使用

做了这个快速测试

UIManager.put("PopupMenu.border", new LineBorder(Color.RED));

Test

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                UIManager.put("PopupMenu.border", new LineBorder(Color.RED));

                JMenuBar menuBar = new JMenuBar();
                JMenu menu = new JMenu("Stuff");
                menu.add(new JMenuItem("A"));
                menu.add(new JMenuItem("BB"));
                menu.add(new JMenuItem("CCC"));
                menuBar.add(menu);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.setJMenuBar(menuBar);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

现在,这可能不太理想,因为这将影响程序中的所有弹出菜单

<强>更新

我查看了JMenu并通过它的UI代表,看起来弹出菜单是在名为private的{​​{1}} JMenu方法中创建的,是一个注入自定义代码的好地方。

该方法实际上是在许多不同的地方调用的,但ensurePopupMenuCreated可能是最容易访问的

Help

getPopupMenu

答案 1 :(得分:1)

我要添加第二种方法。您可以使用setBorder方法:

menuBar.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));

此解决方案的优势在于您可以设置厚度级别。在上面的示例中,厚度级别设置为2。

您还可以在许多组件中使用setBorder绘制各种边框,如下例所示:

首先输入基本代码:

主类:

import javax.swing.*;

public class Main {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            CustomGUI sw = new CustomGUI();
            sw.setVisible(true);
        });

    }
} 

CustomGui.class:

import java.awt.*;
import javax.swing.*;

public class CustomGUI extends JFrame {

    public CustomGUI()  {
        super("Simple example");
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        setSize(500,500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setBackground(Color.DARK_GRAY);



        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("menu B");
        menuBar.add(menu1);

        JMenuItem item = new JMenuItem("A text-only menu item");
        menu1.add(item);

        JMenu menu2 = new JMenu("menu B");
        menuBar.add(menu2);

        JMenuItem item2 = new JMenuItem("A text-only menu item");
        menu2.add(item2);


        add(menuBar);
    }
}

现在通过添加行:

menuBar.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
CustomGUI()

我们得到: enter image description here

现在,如果我们想在jmenu的边框(OP要求的)上添加边框,请添加:

menu1.getPopupMenu().setBorder(BorderFactory.createLineBorder(Color.BLUE, 4));
menu2.getPopupMenu().setBorder(BorderFactory.createLineBorder(Color.BLUE, 4));

enter image description here (如您在图像中看到的,我没有为菜单栏设置边框,但是可以使用上面的方法如上所述进行操作: menuBar.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2)); 而且我还添加了另一个项目,只是为了使菜单更大,更容易看到边框...)