# Variable um 1 hochzählen



## Tonimakkaroni (10. Aug 2016)

Hallo ich möchte eine Variable um 1 hochzählen lassen wenn eine if bediengung erfüllt ist. Die Variable wird über ein Label sichtbar gemacht. Mein Problem besteht darin dass eine Variable die Final ist nicht mehr geändert werden kann . 


```
final int zahl;
zahl = 0;

if (   )
   {zahl++}


final Label lbl = new Label(""+zahl);
```


----------



## JCODA (10. Aug 2016)

wenn du den Inhalt des Labels ändern möchtest, musst du lbl.setText("Hier dein Text") verwenden.
Warum ist zahl final, wenn du sie verändern möchtest?


----------



## VfL_Freak (10. Aug 2016)

Moin,

richtig ... und warum alles _*final *_ist, verstehe ich auch nicht (Poaste ggf. die Aufgabe und mehr Code) !

ich würd's so machen:

```
Label lbl = new Label();
int zahl = 0;
if( // Bedingung )
{
    zahl++
}
// ...
lbl.setText( "" + zahl );
```

Gruß Klaus


----------



## mrBrown (10. Aug 2016)

VfL_Freak hat gesagt.:


> richtig ... und warum alles _*final *_ist, verstehe ich auch nicht (Poaste ggf. die Aufgabe und mehr Code) !


Weil es in den meisten Fällen guter Stil ist. Warum sollte zB `lbl` nicht final sein, das wird vermutlich nie neu zugewiesen werden müssen - das neu zuweisen wäre in den meisten Fällen nur Fehlerquelle.


----------



## Flown (10. Aug 2016)

mrBrown hat gesagt.:


> Weil es in den meisten Fällen guter Stil ist.


Aye, stimme ich dir zu. ABER - es gibt immer ein aber  - jedes mal "final" vor Alles zu schreiben ist ein riesiger Noise und behindert den Lesefluss. Darum kann der Java-Compiler, in Java 8 mit effective final, das selbst induzieren und hält das auch.
Final sollte immer bewusst eingesetzt werden und dient als Stilmittel für, sagen wir zum Beispiel mal, immutable Klassen.


----------



## Tonimakkaroni (15. Aug 2016)

```
int a = 0;
int b = 0;

JLabel a = new JLabel("" + a);
leftPanel.add(a, "cell 1 2");
JLabel b = new JLabel("" + b);
leftPanel.add(b, "cell 1 3");

btnWerteAuf.addActionListener(new ActionListener() { // alle Werte Zurücksetzen
   public void actionPerformed(ActionEvent arg0) {
     a = 0;
     b = 0;
   }
});

final Scanner scanner = new Scanner(chosenPort.getInputStream());
Thread thread = new Thread(){
   @Override public void run() {
     while(scanner.hasNextLine()) {
       try {
         String sb = scanner.nextLine();
         Input.setText(Input.getText()+ "\n" + sb); // Textarea schreibt jeden input in eine neue Zeile und löscht den altren nicht
         Input.setCaretPosition(Input.getText().length()); //Textarea scrollt automatisch mit text nach unten
         FileWriter fw = new FileWriter("c:\\Users\\test.txt");
         fw.write(sb.toString());
         //fw.write(System.getProperty("line.separator"));
         fw.write(Input.getText() + "\r\n" + sb + "\r\n");
       
         if (sb.contains("a")) {
           a++;  
         }
         //if (sb.contains("b"))
         //{b++;}
```
Danke, für die Antworten aber bei mir gehts noch nicht. Hier mein Code:


----------



## JCODA (15. Aug 2016)

1. Bevor du Hilfe von mir bekommst, solltest du den Code so formatieren, dass man was lesen kann. Vielleicht sogar JAVA-Tags statt CODE-Tags verwenden?
2. Warum gibt es  wohl int wie auch JLabel mit dem Namen "a" ?
3. Ansonsten. Lies dir nochmal meinen vorherigen Beitrag durch. Nur weil du Integer-Werte setzt, änderst du noch keinen Inhalt von JLabels... du musst setText verwenden.


----------



## Tonimakkaroni (16. Aug 2016)

Danke für die Antwort: hier nocheinmal neu . Mein Problem liegt darin dass mir Eclipse sagt , ich muss die Variable final machen , damit ich sie im Thread nutzen kann, dadurch kann ich aber den Wert der Variable nicht mehr ändern.


```
int a = 0;int b = 0;

JLabel lbla = new JLabel("" + a);
leftPanel.add(lbla, "cell 1 2");

JLabel lblb = new JLabel("" + b);
leftPanel.add(lblb, "cell 1 3");

btnWerteAuf.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
      a = 0;
      b = 0;
    }
});

final Scanner scanner = new Scanner(chosenPort.getInputStream());
Thread thread = new Thread(){
    @Override public void run() {
      while(scanner.hasNextLine()) {
        try {
          String sb = scanner.nextLine();
          Input.setText(Input.getText()+ "\n" + sb);
          Input.setCaretPosition(Input.getText().length());
          FileWriter fw = new FileWriter("c:\\Users\\test.txt");
          fw.write(sb.toString());
          //fw.write(System.getProperty("line.separator"));
          fw.write(Input.getText() + "\r\n" + sb + "\r\n");
       
          if (sb.contains("a")) {
            a++;
        lbla.setText(""+a); 
          }
     
  if (sb.contains("b"))
         {    b++;
           lblb.setText(""+b);
                }
```


----------



## JCODA (16. Aug 2016)

Du könntest dir eine Art Daten-Klasse schreiben, etwa:


```
public class Data{

    private int a,b;

    public Data(){}

    public void setA(int a){
        this.a=a;
    }

    public void setB(int b){
        this.b=b;
    }
    public int getA(){
       return a;
    }
    public int getB(){
       return b;
    }

     //Optional: coolere Methoden
    public void increaseA(){
       a++;
    }
    public void increaseB(){
       b++;
    }
     public void reset(){
       a=0;
       b=0;
    }
}
```

Dann kannst du sowas machen wie..

```
final Data data = new Data();
final JLabel lbla = new JLabel("" + data.getA());
leftPanel.add(lbla, "cell 1 2");

final JLabel lblb = new JLabel("" + data.getB());
leftPanel.add(lblb, "cell 1 3");

btnWerteAuf.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
      data.setA(0);
      data.setB(0);
      //oder mit coolerer Methode data.reset();
      //Vielleicht sollten hier die Labels noch geändert werden?
    }
});

final Scanner scanner = new Scanner(chosenPort.getInputStream());
Thread thread = new Thread(){
    @Override public void run() {
      while(scanner.hasNextLine()) {
        try {
          String sb = scanner.nextLine();
          Input.setText(Input.getText()+ "\n" + sb);
          Input.setCaretPosition(Input.getText().length());
          FileWriter fw = new FileWriter("c:\\Users\\test.txt");
          fw.write(sb.toString());
          //fw.write(System.getProperty("line.separator"));
          fw.write(Input.getText() + "\r\n" + sb + "\r\n");
   
          if (sb.contains("a")) {
              data.setA(1+data.getA());//oder mit coolerer Methode data.increaseA();
              lbla.setText(""+data.getA());
          }
 
          if (sb.contains("b")) {
             data.setB(1+data.getB());//oder mit coolerer Methode data.increaseB();
             lblb.setText(""+data.getB());
          }
```


----------



## Tonimakkaroni (16. Aug 2016)

Danke funktioniert einwandfrei !


----------

