本文介绍了Swing - 未调用paintComponent方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i simply implemented class that inherits JPanel like below

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是加载图片并调整它自己的大小。

class Orpanel is loading image and adjusting it's own size.

这里的问题。

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

Calling JFrame's setContentpane(Orpanel's instance) makes it works finebut when i attach Orpanel to JFrame calling add() method instead of setContentpane (i know setcontentpane is not meaning attach.. anyway), it dosen't work.

最后弄清楚当我使用add()方法时,添加到JFrame的Component不会调用paintComponent()方法。即使我手动调用repaint()方法,仍然不会调用paintComponent()方法。

finally figured out when i used add() method, Component that was added to JFrame doesn't call paintComponent() method. even though i call repaint() method manually, still paintComponent() method is not called.

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

did i miss something?any help will be appreciated!

提前。
Jaeyong shin。

thx in advance.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是相同的:)

still doesn't work if setContentpane() method replaced to getContentpane().add().don't be confused. Owpanel and Orpanel is same :)

推荐答案

在您的示例代码中,我看到您选择了不使用LayoutManager,这是一个非常糟糕的主意,但无论如何,你是这样走的,我看到你的 Orpanel.paintComponent()没有被调用的一个原因:它可能在框架内不可见!

In your sample code, I see you have chosen NOT to use a LayoutManager, that's a very bad idea, but anyway, sicne you go this way, I see one reason for your Orpanel.paintComponent() not being called: it is probably not visible inside the frame!

如果你没有 LayoutManager ,那么你必须明确设置大小和位置(通过 setBounds())你添加到框架的所有组件。

If you have no LayoutManager, then you must explicitly set the size and location (through setBounds()) of all components you add to the frame.

很可能你没有这样做,因此它的大小 Orpanel 实例可能为0因此它永远不会被绘制。

It is likely you didn't do it, hence the size of Orpanel instance is probably 0 hence it never gets painted.

这篇关于Swing - 未调用paintComponent方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-09 20:35