创建一个里程表
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 所以现在我可以解释你的错误:)。
我试着在这里写了一个程序,它在你每次点击 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 所以现在我可以解释你的错误:)。