2016-07-30 21 views
0

Ich habe versucht, hier ein Programm zu schreiben, das jedes Mal, wenn Sie auf die Schaltfläche "Schritt" klicken, einen Eintrag hinzufügt. Das Problem, das ich habe, ist, dass jedes Mal, wenn ich auf "Step" klicke, die Ziffer überhaupt nicht erhöht wird. Ich denke ich sollte etwas in den actionListener Block schreiben, aber ich weiß nicht was. Bitte helfen Sie mir ... Wenn Sie denken, dass etwas nicht klar ist, werde ich es sehr schnell aufräumen!Erstellen eines Kilometerzählers

-Panel

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"); 
     } 
     } 
    } 
} 

Treiber

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); 
     } 
    } 

`

Antwort

0

Was ich Schritt machen tat es Ihren Code ändern:

statt von

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

label3.setText(" " + counter);

Nun, das ist behoben, aber Ihre Logik war immer noch ausgeschaltet. Immer wenn der Platz des einen über die 9 Schwelle ging, würde er den Zehner um einen und den Zehner um zwei erhöhen.

So sieht es aus wie du warst du warst zuerst nicht aktualisiert in Ihrem Listener als die Person richtig in der früheren Post identifiziert, sondern auch Sie versucht, die Zahl in der Zeichenfolge falsch wieder korrekt durch den früheren Beitrag identifiziert zu konvertieren.

Aber die Logik war aus mehreren Gründen Hier ist Ihre Update-Methode

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 
     } 
    } 
} 

Der Grund, warum das falsch ist, weil wir nur die Hunderterstelle zu erhöhen überprüfen nur wenn es eine Änderung an der Stelle der 10 gab, die die Stelle der 10 von 9 auf 10 erhöht. Wenn der Code in seinem aktuellen Zustand ist, behält er den Zähler als den gleichen Wert wie die 10 und erhöht ihn um eins.

Wenn ich Ihren Code mit der update() ohne den Bug-Fix aufgerufen hatte, würde es wie folgt laufen. 009 -> 210 statt 010 für die obige Erklärung.

Code:

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"); 
      } 
     } 
     } 


    } 
} 

* Nur mein Auftrag fertig, so jetzt kann ich deine Fehler erklären :).

+0

vielen dank! –

0

Sie haben Ihre update() Methode in der actionPerformed(ActionEvent e) Methode aufzurufen. Sie sollten auch einen genaueren Blick auf die anderen Blöcke werfen, die Sie verwenden, vielleicht verpassen Sie etwas.

Versuchen Sie den Code unten (Odometer jetzt implementiert Action) mit:

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"); 
     } 
     } 
    } 
} 

Beachten Sie, dass " " + entfernt wird, um in der Lage zu sein, den String in eine Zahl zu analysieren. Wir könnten auch den leeren Platz im Etikettentext abschneiden, bevor wir den String analysieren.

Unten finden Sie einen Screenshot ohne Ausnahmen in der Konsole:

Odometer test screen

+0

ich danke Ihnen so sehr! Ich habe versucht, den Code und es lässt mich klicken Sie auf die Schaltfläche "Schritt" und es geht zu einem und stoppt aber und gibt mir so viele Fehler wie "Ausnahme im Thread" AWT-EventQueue-0 "java.lang.NumberFormatException: Für Eingabezeichenfolge:" 1 "" –

+0

Mein Code wurde gerade aktualisiert, '" "+' wird entfernt, um die Zeichenfolge in eine Zahl zu zerlegen. Wir könnten auch den leeren Platz im Etikettentext abschneiden, bevor wir den String analysieren. – cdaiga

+0

Wie können wir das int in eine Zeichenkette konvertieren, wenn wir das "" "+" loswerden? –