当前位置: 首页 > 面试题库 >

如果在for循环后添加球,为什么球没有出现在框架中?

商鸿哲
2023-03-14
问题内容

该程序使球从左上角滑到右下角并起作用。但是如果我改变路线

frame.getContentPane().add(ball);

从当前位置到for循环之后,为什么球没有出现在框架上。我同意球不再应该移动,因为在for循环中完成的所有移位甚至都发生在我将球添加到JFrame之前,但是我不明白为什么当我最终将球不显示在屏幕上时将其添加到框架。这是工作程序的代码,如果将上述行移至for循环之后,则球不再显示

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Animate 
{
    private JFrame frame;
    private int x,y;
    public static void main(String args[])
    {
        Animate ballRoll = new Animate();
        ballRoll.go();
    }

    public void go()
    {
        frame = new JFrame();
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MyRoll ball = new MyRoll();
        frame.getContentPane().add(ball);
        for(x = 5;x<=350;x++)
        {
            y=x;

            try
            {
                Thread.sleep(50);
            }
            catch(Exception e)
            {
                System.out.println("dsfsd");
            }
            ball.repaint();
        }


    }

    class MyRoll extends JPanel
    {
        public void paintComponent(Graphics g)
        {
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.setColor(Color.ORANGE);
            g.fillOval(x, y, 100, 100);
        }
    }
}

问题答案:

需要记住的几点:

  1. 不要Thread.sleep()在某个时候挂起整个Swing应用程序,而尝试使用最适合Swing应用程序的Swing Timer。

了解更多如何使用Swing计时器

  1. 不要忘记调用super.paintComponent()覆盖的paintComponent()方法。

  2. frame.setVisible(true)添加完所有组件后,最后调用。

  3. 根据组件的首选大小使用frame.pack()代替frame.setSize(500,500)组件的大小。

  4. 覆盖getPreferredSize()以设置JPanel自定义绘画的首选大小。

  5. 使用SwingUtilities.invokeLater()或EventQueue.invokeLater() 来确保正确初始化了EDT。

阅读更多

* [为什么要在main方法中使用SwingUtilities.invokeLater?](https://stackoverflow.com/questions/15302085/why-to-use-swingutilities-invokelater-in-main-method)

* [SwingUtilities.invokeLater](https://stackoverflow.com/questions/7196889/swingutilities-invokelater)

* [我们是否应该在Java桌面应用程序中使用EventQueue.invokeLater进行GUI更新?](https://stackoverflow.com/questions/3541373/should-we-use-eventqueue-invokelater-for-any-gui-update-in-a-java-desktop-applic)

示例代码:改成按你的风俗画

private Timer timer;
...

timer = new javax.swing.Timer(50, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        y = ++x;
        ball.repaint();

        if (x > 350) {
            timer.stop();
        }
    }
});
timer.setRepeats(true);
timer.start();

public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            Animate ballRoll = new Animate();
            ballRoll.go();
        }
    });
}

class MyRoll extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ...
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
}


 类似资料:
  • 我在mysql数据库中有一个数组数据,我想在使用Ajax得到结果后,用for循环逐个显示出来。过程是这样的。 这是将呈现每个项的段落 null 当我尝试使用for循环时,它会说语法错误,意外的for循环被取走,我该如何解决这个问题,例如,这里我使用sample for循环来使事情尽可能简单。

  • 问题内容: 这是代码- 这是输出- 0 0 1 2 3 4 5 6 7 8 当我想在for循环退出后使用变量i时,出现了我的问题。我会假设我正在读取7,即从零开始的计数中的第8个增量,但实际上是8!在循环退出时对变量i又增加了一个增量。 为了解决这个问题,我必须在循环的末尾以及在其他任何代码中使用它之前,先执行类似i的操作。在我看来,这使代码更难理解。 有更好的解决方案吗? 问题答案: 当值为7时

  • 问题内容: 经过寻找一些参考的数字出来,-unfortunately-我找不到任何关于理解之间的差异有用-和简单- 描述和。当试图了解我们应该如何使用它们时,这有点令人困惑。 我要说的是,我对-default-最为熟悉,它具有传播错误的最简单形式,如下所示: 到目前为止还不错,但是在以下情况下会出现问题: 到目前为止我所知道的是当调用一个函数时必须由a处理,与。所以呢?!在决定使用或时应遵循的逻辑

  • } 链接:https://www.hackerrank.com/challenges/java-string-compare/problem

  • 问题内容: 我了解此构造的工作原理: 但是我不明白为什么else在这里使用它作为关键字,因为它表明所讨论的代码仅在for块未完成时才运行,这与它的工作相反!无论我如何考虑,我的大脑都无法从for陈述到else障碍的无缝发展。对我来说,还是更有意义(我正在尝试训练自己这样阅读)。 我想知道Python编码人员是如何在头脑中读取这个结构的。也许我缺少使这些代码块更容易理解的东西? 问题答案: 即使是经

  • 问题内容: 在包含forEach循环的行上引发了出站异常,但是据我所知,此代码没有错。for循环从char数组的元素0开始,一直循环直到到达最后一个元素…但是当我尝试使用更长的for循环来执行此代码时,即 该代码按预期工作。 为什么在这种情况下for循环起作用,而forEach循环不起作用? 问题答案: 如果您需要在循环中使用索引访问某些内容,请使用for,而不是foreach(已增强)。 现在,