Java 如何在JMenu和JMenu项中去掉白色边框

Java 如何在JMenu和JMenu项中去掉白色边框,java,swing,jmenu,jmenuitem,jmenubar,Java,Swing,Jmenu,Jmenuitem,Jmenubar,我正在用Swing做这个图形界面。我遇到的问题是,我不能将项目周围的白色边框全部涂成黑色。这是一张图片: 我想这样画它(我用paint:D编辑了图像): 有人能帮我吗?我将感谢任何帮助。谢谢大家! 我只是用 UIManager.put(“PopupMenu.border”,新的LineBorder(Color.RED)) 现在,这可能不可取,因为这将影响程序中的所有弹出菜单 已更新 我看了一下JMenu,通过它的UI委托,弹出菜单似乎是在JMenu的private方法中创建的,该方法名为E

我正在用Swing做这个图形界面。我遇到的问题是,我不能将项目周围的白色边框全部涂成黑色。这是一张图片:

我想这样画它(我用paint:D编辑了图像):


有人能帮我吗?我将感谢任何帮助。谢谢大家!

我只是用

UIManager.put(“PopupMenu.border”,新的LineBorder(Color.RED))

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

已更新

我看了一下
JMenu
,通过它的UI委托,弹出菜单似乎是在
JMenu
private
方法中创建的,该方法名为
EnsurePropupMenuCreated
,这将是插入自定义代码的绝佳地方

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


我正在添加第二种方法。您可以使用
setboorder
方法:

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

    }
} 
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);
    }
}
CustomGui.class:

import javax.swing.*;

public class Main {

    public static void main(String[] args) {

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

    }
} 
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()
中,我们得到:

现在,如果我们想在jmenu中添加边框(这是OP所要求的),还需要添加:

menu1.getPopupMenu().setBorder(BorderFactory.createLineBorder(Color.BLUE, 4));
menu2.getPopupMenu().setBorder(BorderFactory.createLineBorder(Color.BLUE, 4));
(如图所示,我没有为菜单栏设置边框,但可以如上所述使用:
menuBar.setboorder(BorderFactory.createLineBorder(Color.BLUE,2));

此外,我还添加了另一项,只是为了使菜单更大,更容易看到边框…

这是所有组装组件的代码吗?我没有研究过这一点,但我记得,弹出窗口是从外观委托生成的,以一种不太容易的方式拦截或控制,您可以尝试查看
弹出菜单.border
UIManager
属性,但这会影响到所有人menus@LuxxMiner这将取决于您试图实现的目标以及您对底层代码的评估程度,以及您是否真的希望对您创建的每个
JMenu
应用
边框,而不是使用一行代码或自定义类来实现它;)@LuxxMiner,我想深入了解弹出窗口是如何创建的;)