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 のインスタンス) を呼び出すと正常に動作しますが、setContentpane の代わりに add() メソッドを呼び出して Orpanel を JFrame にアタッチすると (setcontentpane はアタッチを意味しないことがわかっています)、動作しません。

add() メソッドを使用したときに最終的にわかりました。JFrame に追加されたコンポーネントは、paintComponent() メソッドを呼び出しません。repaint() メソッドを手動で呼び出しても、paintComponent() メソッドは呼び出されません。

私は何か見落としてますか?どんな助けでも大歓迎です!

事前にt​​hx。ジェヨンシン。


私は余分なコードを追加しました。

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()呼び出されない理由が1つあります。フレーム内に表示されない可能性があります。

がない場合は、フレームに追加するすべてのコンポーネントLayoutManagerのサイズと位置を(から)明示的に設定する必要があります。setBounds()

あなたがそれをしなかった可能性があります、それ故にOrpanelインスタンスのサイズはおそらく0であり、それ故にそれは決して塗られません。

于 2011-09-13T09:41:33.910 に答える
0

間違った方法を使用しているように聞こえます。フレームにパネルを追加するときは、これを行う必要があります。

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