java - 用 Java 制作动画

标签 java for-loop

我下周六要做一项 Java 作业。

进展非常顺利,但我在其中一个部分上遇到了困难。

在这里,我想一次显示一个字符串中的一组数字。 我尝试用“Thread.sleep(1000);”减慢循环速度

但是在线程完成之前不会显示任何内容

以下是出现问题的图形类的一部分 我缺少什么吗?

public void paint(Graphics g)
    {
        setSize(550, 300);

        //this draws all the random numbers, revealing the ans to the user
        if (revealNum == 0)
        {
            g.setColor(Color.BLUE);

            g.drawString(randomNumber, 20, 20); //draw String  ("the String", x, y)
        }
        //this reveals the numbers 1 by 1 to the user at the start of the game
        if (revealNum==1)
        {
            for (int x = 0; x < limit; x++)
            {
                g.setColor(Color.BLUE);
                g.drawString(""+x, 20, 20); //draw String  ("the String", x, y)

                try{
                    Thread.sleep(1000);
                }catch(InterruptedException ex){
                    System.out.print("Error");
                }

                repaint();
            }

            //slow down the loop to show the user

        }

最佳答案

由于您的是 GUI,因此调用 Thread.sleep 将使整个应用程序进入休眠状态。而是使用 Swing 计时器。在计时器的 ActionListener 中,向显示的字符串添加另一个字母,然后在字符串完成后通过 stop() 方法停止计时器。

例如,

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class SimpleAnimation extends JPanel {
   public static final int TIMER_DELAY = 1000;
   private JTextField textField = new JTextField(10);
   private JLabel displayLabel = new JLabel("", SwingConstants.CENTER);

   public SimpleAnimation() {
      Action btnAction = new DoItBtnAction("Do It!", KeyEvent.VK_D);
      JPanel topPanel = new JPanel();
      topPanel.add(textField);
      topPanel.add(new JButton(btnAction));
      textField.addActionListener(btnAction);

      setLayout(new GridLayout(2, 1));
      add(topPanel);
      add(displayLabel);
   }

   private class DoItBtnAction extends AbstractAction {
      private String textFieldText = "";
      public DoItBtnAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         displayLabel.setText("");
         setEnabled(false);
         textFieldText = textField.getText();
         new Timer(TIMER_DELAY, new ActionListener() {
            private int i = 0;

            @Override
            public void actionPerformed(ActionEvent e) {
               if (i >= textFieldText.length()) {
                  ((Timer) e.getSource()).stop();
                  DoItBtnAction.this.setEnabled(true);
               } else {
                  displayLabel.setText(displayLabel.getText() + textFieldText.charAt(i));
                  i++;
               }
            }
         }).start();
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SimpleAnimation");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new SimpleAnimation());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

另外,

  • 如果您的 GUI 是 Swing,那么在 JLabel 或 JTextField 中显示文本会比尝试在 GUI 上绘制文本更容易。
  • 如果这是 Swing,请勿重写 paint(Graphics g),而是重写 JPanel 或 JComponent 的 paintComponent(Graphics g) 方法。

关于java - 用 Java 制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26432498/

相关文章:

java - Android自定义布局在设计模式下的布局xml文件中遇到问题

java - 如何在 Spring Boot 中为所有 Controller 指定前缀?

java - Spring Security主体转换

arrays - 如何计算两个数组之间相同数量的元素,不包括重复项

for-loop - 如何将 Julia for 循环返回保存在数组或数据帧中?

c++ - 使用循环 C++ 输入成绩

c# - 在没有 for/foreach/while 的情况下循环方法

java - 如何通过Selenium和WebDriverWait等待元素包含特定属性?

java - 解析连续的 XML 文档流

loops - 从列表中循环 Fortran