如何解决修改 JPopupMenu/JMenuItem 的外观和感觉 自定义
我正在尝试创建一个具有不同颜色和圆形边框的自定义 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);
}
}
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,w-1,h-1,10,10);
g2.drawRoundRect(0,10);
g2.setBackground(Color.red);
g2.setColor(Color.green);
}
}
这就是我希望我的圆形弹出菜单看起来像这样:
我的paintComponent方法做错了吗?
解决方法
您的弹出窗口永远不可见,请调用 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)
方法。
见JPopupMenu#show、JPopupMenu#setVisible
自定义
对于圆形边框,您可以使用 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,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();
}
});
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。