我正在尝试创建一个自定义的JPopupMenu,它具有不同的颜色和圆角边框。我尝试了以下代码,但PopupMenu的外观没有任何变化。
JButton button = new JButton("Test");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
TPopupMenu popup = new TPopupMenu();
JMenuItem item1 = new JMenuItem("Item 1");
JMenuItem item2 = new JMenuItem("Item 2");
popup.add(item1);
popup.add(item2);
}
}自定义PopupMenu
public class TPopupMenu extends JPopupMenu{
public TPopupMenu(){
super();
super.setOpaque(false);
init();
}
private void init(){
setBackground(Color.green);
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.pink);
int w = getWidth();
int h = getHeight();
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTILIAS_ON);
g2.fillRoundRect(0,0,w-1, h-1, 10, 10);
g2.drawRoundRect(0,0,w-1, h-1, 10, 10);
g2.setBackground(Color.red);
g2.setColor(Color.green);
}
}这是我希望我的圆形弹出菜单看起来像这样:

我在paintComponent方法中做错了什么吗?
发布于 2021-03-08 09:43:06
您的弹出窗口永远不可见,请调用show(Component invoker, int x, int y)方法以显示JPopupMenu类。
在组件调用器...的坐标空间中的x,y位置显示弹出菜单
JPopupMenu popup = new JPopupMenu();
JMenuItem item = new JMenuItem("Item");
popup.add(item);
popup.show(frame, frame.getWidth()/2, frame.getHeight()/2);或者,您也可以调用JPopupMenu.setVisible(boolean b)方法。
请参阅,
自定义
对于圆角边框,可以使用new LineBorder(Color.black, 2, true)。LineBorder doc
如果你想要更大的定制,我建议你使用/编写一个外观。请参阅tutorial|uiswing
这是我的测试:
public class Test {
private static void createAndShowGUI() {
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton button = new JButton("Test");
JPopupMenu popup = new JPopupMenu();
popup.setBorder(new LineBorder(Color.black, 2, true));
{
JMenuItem item = new JMenuItem("Cut");
item.setForeground(Color.ORANGE);
popup.add(item);
}
{
JMenuItem item = new JMenuItem("Copy");
item.setBackground(Color.RED);
popup.add(item);
}
{
JMenuItem item = new JMenuItem("Paste");
popup.add(item);
}
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
popup.show(frame, frame.getWidth() / 2, frame.getHeight() / 2);
System.out.println("perfome");
}
});
frame.getContentPane().add(button);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
}

https://stackoverflow.com/questions/66382489
复制相似问题