【问题标题】:paint(Graphics g) prevents Components from being drawnpaint(Graphics g) 防止组件被绘制
【发布时间】:2013-06-28 21:13:19
【问题描述】:

我创建了一个测试版本来简化我为你们遇到的问题:

import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JLabel l = new JLabel("hello");
    JPanel cp;

    public Test(){
        setContentPane(cp = new JPanel());
        cp.add(l);
        setSize(200, 200);
        setVisible(true);
    }

    public void paint(Graphics g){
        //do absolutely nothing
    }
}

当您启动程序时,您会看到一个完全空白的窗口。但是,如果您删除paint 方法,JLabel 就会出现! (真的,我不得不寻找这个错误很久了)。现在,我怎样才能使窗口既可以使用图形又可以定期绘制组件? 提前致谢

【问题讨论】:

  • 您不应该覆盖顶级窗口的paint(...) 方法,因为它很少需要并且通常是有害的。有关更多信息,请参阅 Dave 的答案。

标签: java swing jframe paint paintcomponent


【解决方案1】:

1) 您不应覆盖 JFrame 中的 paint(..),除非您有特定目的。

在Swing中正确的绘制方法是:

  • JPanel 添加到JFrame
  • JPanel 中,覆盖paintComponent(..)getPreferredSize() 以返回适合我们绘图的正确Dimensions。 注意不要忘记调用super.paintComponent(g) 作为覆盖paintComponent 方法的第一次调用,以尊重绘制链

请参阅我的this 答案,其中有一些示例供您参考。

  • 也不要不必要地扩展JFrame
  • 不要在JFrame 上调用setSize,而是使用正确的LayoutManager 和/或覆盖getPreferredSize() - 通常在我们直接绘制时在JPanel 上完成,否则JPanel 将没有大小,如果没有组件被添加,如果它们是,它只会与组件而不是图像一样大。
  • 然后在设置可见之前在 JFrame 上调用 pack()

看看Concurrency in Swing,尤其是Event-Dispatch-Thread

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2011-08-31
    • 2022-01-02
    • 2014-04-14
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多