Java 如何在JMenu和JMenu项中去掉白色边框
我正在用Swing做这个图形界面。我遇到的问题是,我不能将项目周围的白色边框全部涂成黑色。这是一张图片: 我想这样画它(我用paint:D编辑了图像):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
有人能帮我吗?我将感谢任何帮助。谢谢大家! 我只是用
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,我想深入了解弹出窗口是如何创建的;)