使用匿名类中的Graphics

时间:2011-04-25 23:00:58

标签: java swing graphics inner-classes

这是我的代码的一部分,它执行某种动画;然而,似乎出现了一些问题:每当我尝试使用匿名类中传递的'g'来绘制任何内容时,它什么都不做,但是当我在匿名类之外使用它时(在rollBalls方法内)它会做什么它应该这样做。知道为什么吗?我该如何解决这个问题?谢谢。

   protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        rollBalls(g);
    }


    private void rollBalls(final Graphics g) { //Roll all 3 balls on the bar
        new Timer(1, new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                                   g.setColor(Color.red);
                                   g.fillRect(0, 0, 500, 500);
            }
        }).start();
    }

3 个答案:

答案 0 :(得分:3)

我同意Hovercraft Full Of Eels的评论。你应该做这样的事情

class MyClass extends JComponent{

MyClass(){
new Timer(1, new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                 MyClass.this.repaint();
            }
        }).start();
}

 protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.setColor(Color.red);
         g.fillRect(0, 0, 500, 500);
    }

答案 1 :(得分:3)

您的问题有几个问题,但首先您了解传递给paint或paintComponent方法的Graphics对象通常不会持久存在,并且可能在方法完成后被处理掉。接下来,您将从paintComponent方法中调用程序逻辑,该方法永远不应该完成。您无法完全控制何时或甚至调用paint或paintComponent方法,因此不应该指示应用程序的逻辑。

因此,您不会以这种方式进行Swing图形处理。相反,让你的计时器在任何paintComponent方法之外,让它更新类字段,让它调用repaint()并让你的paintComponent使用这些类字段根据需要进行绘图,这次使用稳定的Graphics对象通过参数传递给它

我知道你的代码“只是一个样本”,但是你通过尝试直接从actionPerformed中绘制来做错事。你根本就不应该这样做。

答案 2 :(得分:0)

也许生活在错误的线程上进行GUI更新?尝试将匿名类中的绘图命令放入Runnable并将其传递给SwingUtilities.invokeLater。

我认为它与内在阶级无关。