4

このコードがあり、ボタンが押されたときにグラフィックを再描画したい:

public class JDraw extends JFrame {

/**
 * Draws a figur in a JFrame.
 * The color of it is random and can get changed by a button.
 */

public static JButton okButton = new JButton("change color");

public JDraw(String newTitel) {
    super.setTitle(newTitel);
}

//Main method
public static void main(String str[]) {
    JDraw window = new JDraw("Graphic");
    window.setSize(300, 450);
    window.setVisible(true);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.add(okButton, BorderLayout.SOUTH);

    okButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            //JDraw.repaint(); <-- problem
        }
    });
}



@Override
public void paint(final Graphics g) {

    super.paint(g);

    Random rand = new Random();
    int r1 = rand.nextInt(255);
    int b1 = rand.nextInt(255);
    int g1 = rand.nextInt(255);
    g.setColor(new Color(r1, g1, b1));

    //head
    g.drawOval(100, 50, 100, 100);
    g.fillOval(100, 50, 100, 100); // filled
    //more drawing stuff.....

}
}

ただし、ActionPerfomedで再描画を実行できないため、その方法がわかりません。エラー:非静的メソッドrepaint()は静的コンテキストから参照できません

誰かが助けてくれることを願っています。:)

4

2 に答える 2

10

あなたはあなたの中で次の呼び出しをする必要がありますactionPerformed

window.repaint();

window内部から参照できるようにするactionPerformedには、ウィンドウ変数を作成する必要がありますfinal

final JDraw window = ...;

ただし、いくつかの改善を提案できる場合:

  1. 伸ばさないでJFrame
  2. オーバーライドしないpaint(Graphics)でくださいJFrame
  3. JComponent代わりに、またはを拡張するクラスを作成し、JPanelそれをのコンテンツペインとして設定します。JFrame
  4. 上書きするのではなくpaint(Graphics)、上書きするpaintComponent(Graphics)
  5. あなたokButtonはすべきではありませんstatic。代わりに、次のような非静的メソッドですべてのコードを移動し、次のようなinitUI()コードを作成しますnew JDraw().initUI();
  6. UIを開始するコードをでラップしSwingUtilities.invokeLater(Runnable)て、UIがイベントディスパッチスレッドから適切に開始されるようにします。
于 2012-12-22T23:13:09.110 に答える
5

クラスJDrawを参照することはできません。代わりにオブジェクトを使用する必要があります。あなたの場合のオブジェクトはですwindow。したがって、次を使用します。

window.repaint();

それは言うようなものです:人間、ドアまで歩いてください。人間がクラスです。人間に何かをするように指示することはできません。オバマやサンタクロースのような人間のインスタンスが必要です。あなたの場合:JDrawに再描画するように指示することはできませんが、タイプJDrawのオブジェクト、つまり:window

于 2012-12-22T23:12:29.370 に答える