我正在使用Swing进行此图形界面。我遇到的问题是我不能采用JMenuItems周围的白色边框,并将其全部涂成黑色。这是一张图片:
我想像这样画(我用油漆编辑了图像:D):
有人可以帮助我吗?我会感激任何帮助。谢谢!
答案 0 :(得分:6)
我刚刚使用
做了这个快速测试 UIManager.put("PopupMenu.border", new LineBorder(Color.RED));
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
可能是最容易访问的
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()
中
现在,如果我们想在jmenu的边框(OP要求的)上添加边框,请添加:
menu1.getPopupMenu().setBorder(BorderFactory.createLineBorder(Color.BLUE, 4));
menu2.getPopupMenu().setBorder(BorderFactory.createLineBorder(Color.BLUE, 4));
(如您在图像中看到的,我没有为菜单栏设置边框,但是可以使用上面的方法如上所述进行操作:
menuBar.setBorder(BorderFactory.createLineBorder(Color.BLUE, 2));
而且我还添加了另一个项目,只是为了使菜单更大,更容易看到边框...)