5

我只是实现了继承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 的实例)使其工作正常,但是当我将 Orpanel 附加到 JFrame 调用 add() 方法而不是 setContentpane 时(我知道 setcontentpane 并不意味着附加......无论如何),它不起作用。

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

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

提前谢谢。贾永新。


我添加了额外的代码。

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 是一样的 :)

4

2 回答 2

5

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

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

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

于 2011-09-13T09:41:33.910 回答
0

听起来你只是使用了错误的方法。将面板添加到框架时应该这样做:

frame.getContentPane().add(panel) ;
于 2011-09-13T07:39:49.557 回答