为什么椭圆形运动这么快?

时间:2019-06-04 20:12:02

标签: java swing awt

我正在学习Java,并且我尝试构建了一个在单击面板时会丢球的应用程序。问题在于,绘制椭圆形时,其移动速度如此之快,以至于即使将Thread.sleep设置为最大值也几乎看不到它。我如何放慢速度?

public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(Color.red);
        g2.drawOval(x,y,20,20);

        Thread thread = new Thread() {
            public void run() {
              while (true) {
                y = y + 1;
                repaint();
                try {
                  Thread.sleep(2147483647);
                } 
                catch (InterruptedException ex) {
                }
              }
            }
          };
          thread.start();
    }

2 个答案:

答案 0 :(得分:1)

我还没有在自己的环境中尝试过您的程序,但是据我所知,似乎正在使您动弹的是:

y = y + 1; 

行,因此您可以考虑将其更改为较小的数字,最有可能是两倍。另外,如前所述,也许您可​​以尝试不使用:

while (true)

陈述,因为这将永远永远评估为true,这不是最大的问题,但是也许您可以考虑使用其他东西,例如使用与y变量有关的东西,例如:{{ 1}}或什至是for循环之类的东西,这取决于您在做什么。

希望这会有所帮助,我也建议您在这里查看以下答案: Java Graphics Updating Too Fast

祝你一切顺利!

答案 1 :(得分:0)

  • 摆脱使用paintComponent方法创建线程的作用。

  • 您需要将java Swing TimeractonListener一起使用,以
    增加x和y坐标,然后调用repaint()。检查Java API以获取详细信息。

  • 启动程序时,使用SwingUtilities.invokeLater(()->new className())调用该类。这会将应用程序安排在队列中,以便在事件调度线程(EDT)中进行处理。所有事件和重绘都需要在EDT中进行处理。

  • 在paintComponent方法中,通过setRenderingHints使用Graphics2D设置抗锯齿。 Java API中也对此进行了说明。通过平均边缘,可以使图形看起来更平滑。