创建一个里程表

Create an odometer

我试着在这里写了一个程序,它在你每次点击 Step 按钮时加一个。我遇到的问题是,每次我单击“步骤”时,数字根本不会递增。我想我应该在 actionListener 块中放一些东西,但我不知道是什么。请帮我... 如果你觉得有什么不明白的地方,我会很快解决的!

面板

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

public class Odometer extends JPanel{
   private JLabel label, label2, label3;
   private int counter;
   public Odometer()
   {
      setLayout(new FlowLayout());

      JButton button = new JButton("Step");
      button.addActionListener(new Listener());
      add(button);

      this.setBackground(Color.black);

      label = new JLabel("0");
      label.setFont(new Font("serif", Font.BOLD, 50));
      label.setForeground(Color.white);
      label.setBackground(Color.black);
      label.setOpaque(true);
      add(label);

      label2 = new JLabel("0");
      label2.setFont(new Font("serif", Font.BOLD, 50));
      label2.setForeground(Color.white);
      label2.setBackground(Color.black);
      label2.setOpaque(true);
      add(label2);

      label3 = new JLabel("0");
      label3.setFont(new Font("serif", Font.BOLD, 50));
      label3.setBackground(Color.white);
      label3.setForeground(Color.black);
      label3.setOpaque(true);
      add(label3);

      int counter = 0;
   }


   private class Listener implements ActionListener{
      public void actionPerformed(ActionEvent e){


      }

   }


   public void update()
   {
      counter = Integer.parseInt(label3.getText());
      if(counter < 9){
         counter++;
         label3.setText(" " + counter);

      }

      else{
         counter = 0;
         label3.setText(" " + counter);
         counter = Integer.parseInt(label2.getText());
         if(counter < 9){
            counter++;
            label2.setText(" " + counter);

         }
         else{
            counter = 0;
            label2.setText(" " + counter);
            counter = Integer.parseInt(label.getText());
         }
         if(counter<9){
            counter++;
            label.setText(" " + counter);
         }
         else{
            counter = 0;
            label.setText("0");
         }
      }
   }
}

Driver

import javax.swing.JFrame;
   public class Driver04
   {
      public static void main(String[] args)
      {
         JFrame frame = new JFrame("Odometer");
         frame.setSize(400, 400);
         frame.setLocation(200, 100);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.setContentPane(new Odometer());
         frame.setVisible(true);
      }
   }

`

您必须在 actionPerformed(ActionEvent e) 方法中调用您的 update() 方法。您还应该仔细查看正在使用的 if else 块,可能是您遗漏了什么。

尝试使用下面的代码(Odometer 现在实现了 ActionListener):

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

public class Odometer extends JPanel implements ActionListener {
   private JLabel label, label2, label3;
   private int counter;
   public Odometer()
   {
      setLayout(new FlowLayout());
      int counter = 0;
      JButton button = new JButton("Step");
      button.addActionListener(this);
      add(button);

      this.setBackground(Color.black);

      label = new JLabel("0");
      label.setFont(new Font("serif", Font.BOLD, 50));
      label.setForeground(Color.white);
      label.setBackground(Color.black);
      label.setOpaque(true);
      add(label);

      label2 = new JLabel("0");
      label2.setFont(new Font("serif", Font.BOLD, 50));
      label2.setForeground(Color.white);
      label2.setBackground(Color.black);
      label2.setOpaque(true);
      add(label2);

      label3 = new JLabel("0");
      label3.setFont(new Font("serif", Font.BOLD, 50));
      label3.setBackground(Color.white);
      label3.setForeground(Color.black);
      label3.setOpaque(true);
      add(label3);

   }

   @Override
   public void actionPerformed(ActionEvent e){
      this.update();
   }


   public void update()
   {
      counter = Integer.parseInt(label3.getText());
      if(counter < 9){
         counter++;
         // removed " " + and set the string value of the counter to the label
         label3.setText(String.valueOf(counter));

      }

      else{
         counter = 0;
         label3.setText(counter);
         counter = Integer.parseInt(label2.getText());
         if(counter < 9){
            counter++;
            label2.setText(String.valueOf(counter));

         }
         else{
            counter = 0;
            label2.setText(String.valueOf(counter));
            counter = Integer.parseInt(label.getText());
         }
         if(counter<9){
            counter++;
            label.setText(String.valueOf(counter));
         }
         else{
            counter = 0;
            label.setText("0");
         }
      }
   }
}

注意去掉了" " +,这样才能把字符串解析成数字。在解析字符串之前,我们还可以 trim 标签文本中的空 space。

下面是控制台中无异常的截图:

我为了让它递增所做的是将您的代码更改为:

label3.setText("" + counter); //Empty String

而不是

label3.setText(" " + counter);

现在这个问题已经解决了,但是你的逻辑仍然不对。 每当一个位超过 9 阈值时,它会将十位增加一位,将百位增加两位。

所以看起来你所做的是你首先没有将更新放入你的侦听器中,因为在早期 post 中正确识别的人,但你也试图错误地转换字符串中的数字再次正确识别由较早的 post。

但是由于几个原因逻辑不对 这是您的更新方法

public void update()
   {
      counter = Integer.parseInt(label3.getText());
      if(counter < 9){
         counter++;
         label3.setText(" " + counter);

      }

      else{ //Correctly checks for larger than 9 in 1's place 
         counter = 0;
         label3.setText(" " + counter);
         counter = Integer.parseInt(label2.getText());
         if(counter < 9){
            counter++;
            label2.setText(" " + counter);

         }
         else{ //This is where code goes wrong
            counter = 0;
            label2.setText(" " + counter);
            counter = Integer.parseInt(label.getText());
         } < ---- This brace should be ...
         if(counter<9){
            counter++;
            label.setText(" " + counter);
         }
         else{
            counter = 0;
            label.setText("0");
         }
       <---- Right over here
      }
   }
}

错误的原因是因为只有当 10 的位置发生变化将 10 的位置从 9 增加到 10 时,我们才应该检查增加百位。代码处于当前状态使计数器保持与 10 相同的值并递增 1。

当我 运行 你的代码调用了 update() 而没有错误修复时,它会 运行 如下。 009 -> 210 而不是上面解释的 010。

代码:

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

public class Odometer extends JPanel{
   private JLabel label, label2, label3;
   private int counter;
   public Odometer()
   {
      setLayout(new FlowLayout());

      JButton button = new JButton("Step");
      button.addActionListener(new Listener());
      add(button);

      this.setBackground(Color.black);

      label = new JLabel("0");
      label.setFont(new Font("serif", Font.BOLD, 50));
      label.setForeground(Color.white);
      label.setBackground(Color.black);
      label.setOpaque(true);
      add(label);

      label2 = new JLabel("0");
      label2.setFont(new Font("serif", Font.BOLD, 50));
      label2.setForeground(Color.white);
      label2.setBackground(Color.black);
      label2.setOpaque(true);
      add(label2);

      label3 = new JLabel("0");
      label3.setFont(new Font("serif", Font.BOLD, 50));
      label3.setBackground(Color.white);
      label3.setForeground(Color.black);
      label3.setOpaque(true);
      add(label3);

   }


   private class Listener implements ActionListener{
      public void actionPerformed(ActionEvent e){
          update();

      }

   }


   public void update()
   {

      counter = Integer.parseInt(label3.getText());
      if(counter < 9){
          System.out.println("increment");
         counter++;
         label3.setText("" + counter);

      }

      else{ //When the one's is greater than 9
         counter = 0;
         label3.setText("" + counter);
         counter = Integer.parseInt(label2.getText());


         if(counter < 9){ 
            counter++;
            label2.setText("" + counter);

         }
         else{ //When the 10's place is greater than 9
            counter = 0;
            label2.setText("" + counter);
            counter = Integer.parseInt(label.getText());

         if(counter<9){
            counter++;
            label.setText("" + counter);
         }
         else{ 
            counter = 0;
            label.setText("0");
            }
         }
      }


   }
}

*刚刚完成我的错误运行d 所以现在我可以解释你的错误:)。