gpt4 book ai didi

java - JMenuItems 在 JLayeredPane 中绘制更高的组件

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:54 26 4
gpt4 key购买 nike

我在 JLayeredPane 一层的 JPanel 中有一组 JMenuItems,在更高层的 JPanel 中绘制了一个模拟光标。当菜单项重绘时,它们会在模拟光标上绘制(不会触发光标层的重绘)。有趣的是,如果我用 JButtons 或 JLabels 代替菜单项,每次重新绘制菜单项时都会正确绘制光标。

如何确保重绘菜单项会导致更高层的受影响区域也重绘,而不直接在分层 Pane 上调用 repaint()?我描述的情况与现实有些简化:菜单项可能深深嵌套在分层 Pane 的子项中,它们根本不应该知道分层 Pane 。

这是一段伪代码,说明了我所描述的内容:

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 有一个包私有(private)的 alwaysOnTop() 方法,Swing 绘制系统使用该方法来确定重绘一个组件是否需要重绘其他组件。默认情况下,此方法返回 false,但 JMenuItem 会覆盖它以返回 true,除非菜单项出现在 JInternalFrame 中。因此,出现在 JMenuItem 上方的组件将不会在重绘菜单项时重绘(菜单项位于内部框架中时除外)。

因为 alwaysOnTop() 是包私有(private)的,所以它不能在自定义组件中被覆盖。似乎唯一的解决办法是

  • 使用不同的组件(例如 JButton、JLabel)
  • 将菜单放在内部框架中
  • 使组件透明(即 setOpaque(false))

我最终使用了后一种解决方案。因为我实际上并不想要透明的菜单项,所以我通过调用设置/清除不透明属性来包装绘制代码:

@Override
protected void paintComponent(Graphics g)
{
// paint the component as opaque
setOpaque(true);
super.paintComponent(g);
setOpaque(false);
}

关于java - JMenuItems 在 JLayeredPane 中绘制更高的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5668721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com