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. 而是创建一个扩展JComponentJPanel将其设置为JFrame
  4. paint(Graphics)不是覆盖,而是覆盖paintComponent(Graphics)
  5. okButton不应该static。而是将所有代码移动到非静态方法initUI()中,例如new JDraw().initUI();
  6. 将启动 UI 的代码包装在 a 中SwingUtilities.invokeLater(Runnable),以便从事件调度线程正确启动 UI。
于 2012-12-22T23:13:09.110 回答
5

您不能引用 JDraw 类。您应该改用一个对象。您的情况下的对象是window. 所以,使用:

window.repaint();

就像在说:人类,走到门口。人是阶级。你不能告诉 Human 做某事,你需要一个 Human 的实例,比如 Obama 或 Santa Claus。在您的情况下:您不能告诉 JDraw 重新绘制,而是 JDraw 类型的对象,即:window

于 2012-12-22T23:12:29.370 回答