# JLabel aktualisieren



## javaneuling10 (1. Feb 2011)

Hallo,

ich sitze gerade an einer Übungsaufgabe und schaffe es einfach nicht ein Label zu "aktualisieren". 


```
// Wuerfel.java                         

import java.awt.*;                         
import javax.swing.*;          //JFrame, JPanel, JLabel
import java.awt.event.*;                    // Listener

/**
 * Erzeugen eines Fensters mit Text und Button.
 */
public class Wuerfel
  extends JFrame
  implements ActionListener
{
/* ------------------------------------------------- */
                                                // View
/**
 * Konstante, Aendern der Würfelzahl.
 */
  static public String ACTION_WURF = "Wurf";

/**
 * Konstante, Beenden des Programms.
 */
  static public String ACTION_QUIT = "Beenden";

/**
   * Instanzvariable, Augenzahl des Würfels.
   */    
  private int zahl;
  
/**
 * Content Pane, Darstellungsbereich des Fensters.
 */
  private JPanel contentPane;
  
  
  

/**
 * Konstruktor, baut das Fenster auf.
 * @param titel Titelleistentext
 * @param farbe Fensterhintergrundsfarbe
 */
  public Wuerfel( String titel)
  {
// Titelleiste
    super( titel);

// Darstellungsbereich
    contentPane = new JPanel();
                             // Button Set mit Listener
    JButton btWurf = new JButton( ACTION_WURF);
    contentPane.add( btWurf);
    btWurf.addActionListener( this);
                                         // Label Hallo
    
    zahl = this.zahl;
    JLabel lbWurf = new JLabel();
    lbWurf.setText( "" + zahl );
    contentPane.add( lbWurf);
                            // Button Quit mit Listener
    JButton btQuit = new JButton( ACTION_QUIT);
    contentPane.add( btQuit);
    btQuit.addActionListener( this);

// Fenster
                           // Fensterinhalt uebernehmen
    setContentPane( contentPane);
    pack();              // Anpassen der Fenstergroesse
                              // Beenden durch x-Button
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
    setVisible( true);                // Sichtbarmachen
  }

/* ------------------------------------------------- */
                                          // Controller
/**
 * Ereignisverarbeitung, ActionListener,
 * Betaetigen eines Button.
 */
  public void actionPerformed( ActionEvent ae)
  {
    String command = ae.getActionCommand();

// Würfeln durch Button Wurf
    if( command.equals( ACTION_WURF))
    {    	
      zahl = (int)(Math.random()*6)+1; 
      this.zahl = zahl;

      System.out.println(zahl);
      System.out.println(this.zahl);
      
    }

// Programmabbruch durch Button Quit
    if( command.equals( ACTION_QUIT))
    {
      System.exit( 0);
    }
  }

/* ------------------------------------------------- */
/**
 * Aufruf des Programms.
 */
  public static void main(String args[])
  {
	  Wuerfel wuerfeln = 
      new Wuerfel( "Würfel");
  }
}
```

Ich habe eine Instanzvariable angelegt 

  private int zahl;

im GUI .. "Wuerfel" ... wird beim Start des Programms auch der Wert der Instanzvariable übernommen.
Des Weiteren funktioniert auch die Aktualisierung der Instanzvariable zahl durch das Action Event(siehe System.out - Überprüft! ). Jedoch fehlt mir anscheinend etwas um die GUI zu aktualisieren. Aber ich weiß einfach nicht was ?!


----------



## SlaterB (1. Feb 2011)

das JLabel muss Klassenattribut sein und bei Änderungen musst du dort setText() neu ausführen


----------



## Negi (1. Feb 2011)

Hallo javaneuling.

Wenn cih das richtig sehe willst das diesen Label "lbWurf" umbenenn/akualisieren. Dazu würde ich die empfehlen als ersten mal Global zu definieren und nicht nur Lokal wie du es momentan machst.
Anschließend kannst du einfach über die .setText(String text) den Text des Labels ändern. Daraufhin wird das von selbst aktualisiert.
Sollte in etwa so aussehen:

```
public class Wuerfel
  extends JFrame
  implements ActionListener
{
      private JPanel lbWurf; // hier schon das Label definieren

     ...

    lbWurf = new JLabel();
    lbWurf.setText( "" + zahl );
    contentPane.add( lbWurf);

    ...

public void actionPerformed( ActionEvent ae)
  {
    String command = ae.getActionCommand();
 
// Würfeln durch Button Wurf
    if( command.equals( ACTION_WURF))
    {   
         zahl = (int)(Math.random()*6)+1; 
         this.zahl = zahl;
    
         lbWurf.setText(zahl);
...
```

so sollte es dann grob aussehen

Mfg Negi


----------



## javaneuling10 (1. Feb 2011)

Das klingt nachvollziehbar. Evtl. sollte ich mir einmal ein Buch über Java zulegen. Unser Uniskripte und die zugehörigen Vorlesungen lassen leider zu viele Fragen offen.

danke


----------



## javaneuling10 (1. Feb 2011)

Hmm, klappt wohl leider doch nicht. 

...

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at Wuerfel.actionPerformed(Wuerfel.java:97)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

... usw ...

ich dachte erst, dass es daran liegt das du versehentlich JPanel statt JLabel bei der Labeldefinition geschrieben hast. Aber daran liegt es wohl nicht.


----------



## xehpuk (1. Feb 2011)

Ohne Code lässt sich dazu nicht viel sagen. Ist das JLabel denn überhaupt initialisiert, wenn du darauf 
	
	
	
	





```
setText()
```
 aufrufst? (Ich geh mal davon aus, dass es daran liegt.)


----------



## javaneuling10 (2. Feb 2011)

Der Code steht doch im 1. post? Was meinst du genau mit initialisiert?

java.swing.* ist importiert und das JLabel lbWurf ist auch definiert. Oder meinst du, dass ich in Eclipse bei

lbWurf. (--> Auswahlfenster) setText auswählen kann? 

Alles ist eigentl. vorhanden. Oder was meinst du?


----------



## xehpuk (2. Feb 2011)

javaneuling10 hat gesagt.:


> Der Code steht doch im 1. post?





javaneuling10 hat gesagt.:


> _Geändert von javaneuling10 (Heute um 00:41 Uhr)_


Joa, mittlerweile schon. 



javaneuling10 hat gesagt.:


> Was meinst du genau mit initialisiert?


Ich meinte damit, ob du sicherstellst, dass das JLabel nicht null ist. Das tust du übrigens nicht:
[JAVA=60]JLabel lbWurf = new JLabel();[/code]
Erstellt eine Lokalvariable 
	
	
	
	





```
lbWurf
```
. Die Instanzvariable bleibt davon also unberührt. Richtig ist somit:
[JAVA=60]lbWurf = new JLabel();[/code]
(Was übrigens auch schon so im Code von Negi war.)

Wenn du eine Fehlermeldung zum Code postest, solltest du darauf achten, dass die Zeilenangaben übereinstimmen (oder die betroffene Zeile zumindest über einen Kommentar hervorheben).

Ach ja: Du solltest Code aus den vorherigen Beiträgen nicht editieren, damit man im Nachhinein das Problem noch nachvollziehen kann.


----------



## javaneuling10 (2. Feb 2011)

Ok, ich dachte du meintest es wäre allg. kein Code vorhanden. Stimmt schon, hab es erst nach deinem Post aktualisiert, also das JLabel oben definiert und setText im ActionEvent hinzugefügt. Das hab ich wohl falsch verstanden(btw. 1. Post wieder Ursprungszustand). Na ok, dann teste ich das einmal. Danke 

*Edit* Jetzt ist zwar der Fehler weg, aber funktionieren tut es trotzdem nicht. Also, das Label wird nicht geändert.


```
// Wuerfel.java                         

import java.awt.*;                         
import javax.swing.*;          //JFrame, JPanel, JLabel
import java.awt.event.*;                    // Listener

/**
 * Erzeugen eines Fensters mit Text und Button.
 */
public class Wuerfel
  extends JFrame
  implements ActionListener
{
/* ------------------------------------------------- */
                                                // View
/**
 * Konstante, Aendern der Würfelzahl.
 */
  static public String ACTION_WURF = "Wurf";

/**
 * Konstante, Beenden des Programms.
 */
  static public String ACTION_QUIT = "Beenden";

  
/**
   * Instanzvariable, Augenzahl des Würfels.
   */  
  private int zahl;

/**
 * Content Pane, Darstellungsbereich des Fensters.
 */
  private JPanel contentPane;
  
  private JLabel lbWurf = new JLabel();
  
  
  

/**
 * Konstruktor, baut das Fenster auf.
 * @param titel Titelleistentext
 * @param zahl aktuelle Augenzahl des Würfels
 */
  public Wuerfel( String titel)
  {
// Titelleiste
    super( titel);

// Darstellungsbereich
    contentPane = new JPanel();
                             // Button Set mit Listener
    JButton btWurf = new JButton( ACTION_WURF);
    contentPane.add( btWurf);
    btWurf.addActionListener( this);
                                         // Label Augenzahl
    JLabel lbWurf = new JLabel();
    lbWurf.setText( "" + zahl );
    contentPane.add( lbWurf);
                            // Button Quit mit Listener
    JButton btQuit = new JButton( ACTION_QUIT);
    contentPane.add( btQuit);
    btQuit.addActionListener( this);

// Fenster
                           // Fensterinhalt uebernehmen
    setContentPane( contentPane);
    pack();              // Anpassen der Fenstergroesse
                              // Beenden durch x-Button
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
    setVisible( true);                // Sichtbarmachen
  }

/* ------------------------------------------------- */
                                          // Controller
/**
 * Ereignisverarbeitung, ActionListener,
 * Betaetigen eines Button.
 */
  public void actionPerformed( ActionEvent ae)
  {
    String command = ae.getActionCommand();

// Würfeln durch Button WURF
    if( command.equals( ACTION_WURF))
    {    	
      zahl = (int)(Math.random()*6)+1; 
      this.zahl = zahl;
      
      lbWurf.setText("" + zahl);

    }

// Programmabbruch durch Button Quit
    if( command.equals( ACTION_QUIT))
    {
      System.exit( 0);
    }
  }

/* ------------------------------------------------- */
/**
 * Aufruf des Programms.
 */
  public static void main(String args[])
  {
	  Wuerfel wuerfeln = 
      new Wuerfel( "Würfel");
  }
}
```

###

Z 37 = new JLabel(); und Z 59 JLabel (vor lbWurf) entfernt und schon funktionierts 

Ok geklärt. funkioniert also doch, man müsste nur mal richtig lesen können ... ^^ Danke.


----------

