1

これは、次の Java コードですJPanel

class Battle_field extends JPanel{
    public List<Image_Obj> pics_to_be_drawn;    

    @Override   
    public void paintComponent(Graphics g){     
            super.paintComponent(g);                 
            g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null);
    }       
}

GUI をセットアップすると、次のようになります。

added_panel= new Battle_field();
added_panel.setBorder(new LineBorder(SystemColor.activeCaption, 3));
added_panel.setBounds(27, 10, 397, 630);
added_panel.setBackground(Color.white);
this.getContentPane().add(added_panel);

上記のオブジェクトを作成すると、 が自動的Battle_field()に呼び出されることがわかりました。paintComponent

しかし、ここでは、変数「pics_to_be_drawn」をまだ初期化していないので、これを呼び出すとコンパイラ エラーが発生します。このデザインは仕方がないのでしょうか?
あなたがそうするように、それは起こる必要がありますか?私はこれを非常に知りたい、そしてもちろん解決策を知りたい.

ps: 公式ドキュメントによると、私が を呼び出した場合にのみ、repaint()が呼び出されますpaintComponent()。そのため、カスタマイズしたコードを 内に記述できますpaintComponent

4

3 に答える 3

2

JpanelのpaintComponentは、ウィンドウが表示される(カバーされていない、または最小化されている)か、サイズが変更されると自動的に呼び出されます。paintComponentをいつ呼び出すことができるかについての詳細は次のとおりです。

于 2012-07-03T14:17:34.093 に答える
2

Swing はpaintComponent()、パネルを描画する必要があるときにメソッドを呼び出します。パネルが表示されるまで呼び出されないと思います。

つまり、パネルが GUI に追加されるとすぐに、パネルはペイント可能な状態になるはずです。したがって、paintComponent()メソッドは、リストが null でない (および空でない) かどうかを確認するだけで、写真がまだ追加されていない場合を処理する必要があります。

@Override   
public void paintComponent(Graphics g){     
    super.paintComponent(g);                 
    if (pics_to_be_drawn != null && !pics_to_be_drawn.isEmpty()) {
        g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null);
    }
}

補足: リストをCollections.emptyList()または に初期化するnew ArrayList<>()と、null のチェックが回避されます。また、Java の命名規則も尊重します。つまり、クラス名と変数名にアンダースコアを使用せず、camelCasing.

于 2012-07-03T14:11:59.683 に答える
2

いつ、または呼び出されたかを制御できないことpaint(...)paintComponent(...)理解repaint()してください。これは、コンポーネントをペイントする必要があることを再描画マネージャーに示唆するだけであり、これが常に起こるとは限らないこと、コンポーネントがレンダリングされるとすぐにペイントが行われることを理解してください。次に、これを受け入れて、これを回避するようにコードを調整してください。検討:

  • pics_to_be_Drawing を null に初期化します (そのため、何かに初期化します)
  • 次に、描画する前に null でないことを確認します。

これを変える:

class Battle_field extends JPanel{
    public List<Image_Obj> pics_to_be_drawn;    

    @Override   
    public void paintComponent(Graphics g){     
            super.paintComponent(g);                 
            g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null);
    }       
}

これに:

class Battle_field extends JPanel{
    public List<Image_Obj> pics_to_be_drawn;    

    @Override   
    public void paintComponent(Graphics g){     
            super.paintComponent(g);          
            if (pics_to_be_drawn != null) { 
               g.drawImage(pics_to_be_drawn.get(0).Get_the_buf_img() , 41, 41, 59, 59, Color.black, null);
            }
    }       
}

単純

于 2012-07-03T14:08:45.700 に答える