以下のように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() メソッドは呼び出されません。
私は何か見落としてますか?どんな助けでも大歓迎です!
事前にthx。ジェヨンシン。
私は余分なコードを追加しました。
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 は同じです :)