微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JMenuItems在JLayeredPane中的更高组件上绘画

如何解决JMenuItems在JLayeredPane中的更高组件上绘画

|| 我在JlayeredPane的一层上的JPanel中有一组JMenuItems,在更高层的JPanel中画了一个模拟光标。当菜单项重新绘制时,它们将在模拟光标上绘制(而不触发光标层的重新绘制)。有趣的是,如果我用JButtons或JLabel代替菜单项,则每次重新绘制菜单项时都将正确绘制光标。 如何确保重新绘制菜单项也将导致较高层的受影响区域也重新绘制,而无需直接在分层窗格上调用repaint()?我所描述的情况与实际情况相比有所简化:菜单项可能深深地嵌套在分层窗格的子级中,它们根本不应该了解分层窗格。 这是伪代码的片段,说明了我所描述的内容
public void initGui(Dimension size) {
   JlayeredPane layeredPane = new JlayeredPane();
   layeredPane.setSize(size);

   menuPanel = new JPanel();
   menuPanel.setSize(size);
   layeredPane.add(menuPanel,BottOM_LAYER);

   JPanel cursorPanel = new CursorPanel();
   cursorPanel.setSize(size);
   layeredPane.add(cursorPanel,TOP_LAYER);
}

public void showMenu(Component[] menuItems) {
   JPanel menu = new JPanel();
   for (Component c: menuItems)
      menu.add(c);
   menuPanel.add(menu);
}
    

解决方法

JComponent有一个程序包专用的“ 1”方法,Swing绘画系统使用该方法来确定是否重新绘画组件可能需要重新绘画其他组件。默认情况下,此方法返回
false
,但是JMenuItem覆盖它以返回
true
,除非菜单项出现在JInternalFrame中。因此,重绘菜单项时(除非菜单项位于内部框架中),否则不会重绘出现在JMenuItem上方的组件。 由于“ 1”是软件包专用的,因此不能在自定义组件中覆盖它。似乎唯一的解决方案是 使用其他组件(例如JButton,JLabel) 将菜单放在内部框架中 使组件透明(即
setOpaque(false)
) 我最终使用了后一种解决方案。由于我实际上并不想要透明菜单项,因此我用调用代码来包装绘画代码,以设置/清除opaque属性:
@Override
protected void paintComponent(Graphics g)
{ 
   // paint the component as opaque
   setOpaque(true);
   super.paintComponent(g);
   setOpaque(false);
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。