java - 使用匿名类中的图形

标签 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();
    }

最佳答案

您的问题是多方面的,但首先您了解传递到 paint 或 paintComponent 方法中的 Graphics 对象通常不会持久存在,并且可能会在该方法完成后被丢弃。接下来,您有从 paintComponent 方法中调用的程序逻辑,这是永远不会完成的。您无法完全控制何时甚至是否调用 paint 或 paintComponent 方法,因此不应让它支配您应用程序的逻辑。

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

我知道您的代码“只是一个示例”,但是您尝试直接从 actionPerformed 中绘制是错误的。你根本不应该这样做。

关于java - 使用匿名类中的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5784233/

相关文章:

java - 如何使用 Mockito 验证重载方法的调用次数?

java - JScrollPane 中的透明 JList

algorithm - 自动跟踪算法

android - 有关 Android 3D 的初学者问题

graphics - 如何将由 4 个点标识的任意平面投影到二维平面上?

java - 带有社交认证的 Rest APi 实现

java - 如何从java代码调用外部dll函数

java - 如何减小 Tflite 模型的大小或下载并以编程方式设置?

java - 将一个组件右对齐,将其他几个组件对齐到死点

java - 如何让JTable显示数据库中的所有记录