jLabel wird nicht aktualisiert

oomworld

Mitglied
Hallo liebe JavaFans 🙂
das ist mein erster Post hier im Forum 😀 und freue mich euch kennenzulernen und natürlich auch auf eure Hilfe. 😳

Seit ca. Monate bringe ich mir Schritt für Schritt das Java-programmieren bei.
Ich programiere am Anfang kleine dinge, um auch mal Erfolg zu haben und das Erlernte anzuwenden.

( Ich programmiere mit NetBeans 6.8 )

Ich habe hier ein JForm mit einem Label.
Grundsätzlich weiß ich wie ich das Label verändern kann ( mit Buttons ) etc. zu jLabel2.setText.

Mein Vorhaben:
in einem Fenster steht Holz = 10 jLabel2 ( "Holz" und "10" sind 2 verschiedene Labels )
Der Wert "10" wird alle 5 Sekunden um 5 erhöht, dazu habe ich TimerTask benutzt und zwei Klassen geschrieben die das bewerkstelligen.

Auf jedenfall habe ich das gefühl das die Klassen nicht ausgeführt werden, obwohl der Wert "10" aber aus der Klasse herausgelesen wird.


Hier mein Script:

jLabel ausschnitt:
Meine Problemzone Zeile 73 - 84
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * gamexEngine.java
 *
 * Created on 07.01.2010, 16:09:29
 */

package gamex;
import java.util.*;

/**
 *
 * @author oOm
 */
public class gamexEngine extends javax.swing.JFrame {

    /** Creates new form gamexEngine */
    public gamexEngine() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Holz");

        jLabel2.setText("jLabel2");
        jLabel2.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                jLabel2PropertyChange(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(172, 172, 172)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addComponent(jLabel1))
                .addContainerGap(194, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(22, 22, 22)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addContainerGap(30, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jLabel2PropertyChange(java.beans.PropertyChangeEvent evt) {                                       

timerEngine booM = new timerEngine();
int boomA = booM.holzA;

String wooD;

wooD =(new Integer(boomA).toString());

        jLabel2.setText(wooD);

    }                                      

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new gamexEngine().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    // End of variables declaration                   

}

Klasse1 Name (timerEngine)
Hier wird Holz um 5 erhöht.
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gamex;
import java.util.*;

/**
 *
 * @author oOm
 */
public class timerEngine extends TimerTask {

    //Eigenschaften

    int holzA = 10;

    @Override public void run()
  {

holzA = holzA + 5;

  }

}

Klasse2 Name ( TimerCfg )
Hier wird die Klasse timerEngine alle 5 Sekunden ausgeführt
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gamex;
import java.util.*;
/**
 *
 * @author oOm
 */
public class timerCfg {

    {
    Timer timer = new Timer();

    // Start in 2 Sekunden und läuft alle 5 Sekunden
    timer.schedule( new timerEngine(), 2000, 5000 );

  }

}

vielen Dank für eure Unterstützung
oomworld
 
zum einen wird die TimerTask nirgends im Hauptprogramm gestartet und zum anderen bringt es nichts nur eine Variable hochzuzählen, wenn sich eine Textanzeige ändern soll.

Die TimerTask Klasse muss eine Referenz auf das Label besitzen, um es zu aktualisieren - oder sonst irgendwie drauf zugreifen können.

Versuch's doch mal erst mit einem Label ohne irgendwelche Listener - <pers. Meinung>und eventuell auch ohne GUIBuilder</pers. Meinung>
Einfach nur eine Label im Frame eine Zählvariable und ein Thread/TimerTask
 
Hier eine kleine Demo
Java:
import java.awt.BorderLayout;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TimerDemo extends JFrame {
	private JLabel label;

	public TimerDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(0, 0, 200, 60);
		label = new JLabel("", JLabel.CENTER);
		this.getContentPane().add(label, BorderLayout.CENTER);

		new Timer().schedule(new MyTimer(label), 0, 1000);
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new TimerDemo();
	}
}

class MyTimer extends TimerTask {
	private JLabel label;

	private int value;

	public MyTimer(JLabel label) {
		this.label = label;
		value = 0;
	}

	public void run() {
		value += 5;
		label.setText("" + value);
	}
}
 
Hallo Michael,

vielen Dank für deine Antwort, ganz schlau bin ich allerdings noch nichts daraus geworden, du musst wissen, ich bin ein Anfänger 🙂!

Einfach nur eine Label im Frame eine Zählvariable und ein Thread/TimerTask.

Wie meinst du das genau? bzw. wie mache ich das?

Zitat:
zum einen wird die TimerTask nirgends im Hauptprogramm

Ich weis das bekomme ich auch nicht hin, weil ich das extends TimerTask nicht unterkriege.
Wie kann ich die Klasse einbinden?

Zitat:
zum anderen bringt es nichts nur eine Variable hochzuzählen, wenn sich eine Textanzeige ändern soll.

Die TimerTask Klasse muss eine Referenz auf das Label besitzen, um es zu aktualisieren - oder sonst irgendwie drauf zugreifen können.

Okay ich kann es irgendwie nachvollziehen, leider habe ich noch nicht soo viel praktische Erfahrung
hast du ein Beispiel oder einen "Ansatz" für mich? was ist mit "Referenz" gemeint ( Verbindung ) ?

danke für die Hilfestellungen 🙂!
 
Danke die Demo, funktioniert, ich muss Sie mir mal gut einprägen.
Leider benutze ich den GUIBuilder weil das echt ein haufen Befehle sind die man sich Merken muss.

kann ich hier: public class gamexEngine extends javax.swing.JFrame

extends TimerTask einfügen?

so das es so aussieht:
public class gamexEngine extends javax.swing.JFrame extends TimerTask

oder so ähnlich?
laut Editor nämlich nicht. Ich verstehe aber nicht warum.
 
Machs doch einfach ohne Hilfsklassen und ohne Timer:

Java:
package gamex;
import java.util.*;
/**
 *
 * @author überschrieben 
 */
public class gamexEngine extends javax.swing.JFrame {

int boomA;
 public String wooD;
    int holzA = 10;
    /** Creates new form gamexEngine */
    public gamexEngine() {
        initComponents();

        timerEngine booM = new timerEngine();
        Thread boomT = new Thread(booM);
        
        boomT.start();

         

        
    }


    public class timerEngine implements Runnable {
    Timer timer;
    //Eigenschaften
   

    public void run()
  {
     while(holzA < 500) {
     holzA = holzA + 5;
     wooD =(new Integer(holzA).toString());
     try {
     Thread.sleep(5000);
     } catch (Exception ex) {
         ex.printStackTrace();
     }
     jLabel2.setText(wooD);
     }
     
  }
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Holz");

        jLabel2.setText("jLabel2");
        jLabel2.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                jLabel2PropertyChange(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(172, 172, 172)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addComponent(jLabel1))
                .addContainerGap(194, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(22, 22, 22)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addContainerGap(30, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jLabel2PropertyChange(java.beans.PropertyChangeEvent evt) {



    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new gamexEngine().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    // End of variables declaration

}
 
ja vielen Dank echt ein sehr gutes und einfaches Beispiel!
vielen Dank CToJava denke das ich erstmal so weiterarbeiten werde 🙂

aber die Timer / TimerTask geschichte muss ich mir trotzdem sehr gut anschauen :rtfm:, ich denke das es eines der wichtigsten Elemente ist. 🙂

ansonsten Danke für die schnelle und kompotente hilfe :toll:!
 

Zurück
Oben