Swing - paintComponent方法未被调用

5
我只是实现了一个继承JPanel的类,如下所示:

我只是实现了一个继承JPanel的类,如下所示

public class Orpanel extends JPanel {

....
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(tpaint);
        g2d.fill(rect); 
    }
....
}

Orpanel类正在加载图像并调整自身大小。

这里有一个问题。

调用JFrame的setContentpane(Orpanel的实例)可以正常工作,但是当我使用add()方法而不是setContentpane将Orpanel附加到JFrame时(我知道setcontentpane并不意味着附加..无论如何),它不起作用。

最终发现当我使用add()方法时,被添加到JFrame中的组件不会调用paintComponent()方法。即使我手动调用repaint()方法,仍然不会调用paintComponent()方法。

我错过了什么吗? 任何帮助将不胜感激!

提前致谢。 Jaeyong shin。


我添加了额外的代码。

public Test(OwPanel op) 
{
    super();
    Dimension monitor = Toolkit.getDefaultToolkit().getScreenSize();
    op.setBackground(Color.white);
    this.setBackground(Color.white);        
    this.setBounds(monitor.width / 2 - 200 , monitor.height / 2 - 200, 400, 400);       
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setTitle("test");      
    this.setLayout(null);
    this.getContentPane().add(op);
    //this.setContentPane(op);
    this.setVisible(true);
    this.validate();
}

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            OwPanel op = new OwPanel("d:\\java_workplace\\img\\img1.jpg", 100, 100);
            OwLabel ol = new OwLabel("d:\\java_workplace\\img\\img2.jpg", 300, 50);
            Test tst =  new Test(op);
            tst.add(ol);
        }
    });

如果将setContentpane()方法替换为getContentpane().add(),仍然无法正常工作。不要混淆,Owpanel和Orpanel是相同的 :)

你能提供将 OrPanel 添加到 JFrame 的代码吗? - Mohayemin
1
jFrame.getContentPane().add(jPanel) .... 应该可以工作。 - TeaCupApp
3
我有什么遗漏吗?当然,您必须编辑您的帖子,并发布显示您问题的代码。这里是规则http://sscce.org/ - mKorbel
2
@SkeetOverFlow - 不需要大量输入,一个简单的frame.add就可以了;-) - kleopatra
2个回答

5
在您的示例代码中,我看到您选择了不使用LayoutManager,这是一个非常糟糕的想法,但无论如何,既然您选择了这种方式,我看到您的Orpanel.paintComponent()不被调用的一个原因可能是:它可能在帧内不可见!
如果您没有使用LayoutManager,则必须通过setBounds()显式设置添加到框架中的所有组件的大小和位置。
很可能您没有这样做,因此Orpanel实例的大小可能为0,因此它永远不会被绘制。

更好的方法是在自定义组件中覆盖getPreferredSize()方法并像此答案所示使用布局管理器。 - Andrew Thompson

0

听起来你只是在使用错误的方法。当向框架添加面板时,你应该这样做:

frame.getContentPane().add(panel) ;

2
我不知道,这不等同于 frame.add(panel); 吗? - Mohayemin
2
不需要(我不记得覆盖方法是从什么时候开始添加的,可能已经有十年了;-) 另外肯定有其他问题...) - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接