【问题标题】:Child component with overridden paintComponent method draws component over top of JPanel具有覆盖的paintComponent 方法的子组件在JPanel 之上绘制组件
【发布时间】:2019-07-28 08:57:04
【问题描述】:

我有一个使用 OverlayLayout 布局管理器的父 JPanel,并且 JPanel 包含一个主面板和覆盖面板。

例如

setLayout(new OverlayLayout(this));
add(overlayPanel)
add(mainPanel);

这工作正常,但主面板包含许多我无法控制的组件,并且很多组件已经覆盖了paintComponent,当它们重新绘制时,它们最终会绘制在覆盖面板的顶部。

如果我随后调整整个窗口的大小,则 2 个面板会正确堆叠显示。有没有办法可以防止这种情况发生或收到子组件已重绘的通知,以便我可以重绘整个窗口?

我确实尝试过使用 JLayeredPane,但我很挣扎,因为主窗口可以调整大小,并且由于它不使用 LayoutManager,我不得不设置边界,我很难让它工作。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    通常,面板包含以 2 维绘制的组件,因此您只需重新绘制单个组件,它不会影响其他组件。绘画针对这种情况进行了优化。

    但是,在使用 OverlayLayout 时,组件会以 3 维绘制,因此绘制单个组件会影响其他组件。所以需要去掉默认完成的优化绘制:

    JPanel main = new JPanel()
    {
        @Override
        public boolean isOptimizedDrawingEnabled()
        {
            return false;
        }
    };
    
    main.setlayout( new OverlayLayout(main) );
    main.add( overlayPanel );
    main.add( backgroundPanel );
    

    或者在您的情况下,您似乎正在扩展 JPanel,因此您只需要覆盖 isOptimizedDrawingEnabled() 方法。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2021-04-14
      • 2018-03-18
      相关资源
      最近更新 更多