Labels mit setter-Methode modifizieren

Status
Nicht offen für weitere Antworten.

hawkeye78

Bekanntes Mitglied
Hallo,

ich habe heute eine GUI zusammengebastelt, und rufe über einen ActionListener (von dem bsync-Button) die Klasse PDA auf, wo ich im Konstruktur eine Verbindung zu einem PDA aufbaue und von dort die Daten auslese. Das funktioniert auch soweit. Nun habe ich allerdings das Problem das ich es zwar hinbekomme aus der PDA Klasse die richtige Setter-Methode in der GUi-Klasse aufzurufen Java dann allerdings nicht das entsprechende Label aktualisiert. Konkret bedeutet dieses ich bekomme es zwar hin aus der Klasse PDA die Methode setStatusbar() aufzurufen, er aber trotzdem nicht das entsprechende Label aktualisiert.
Mein Quellcode (leich zusammen gestrichen) sieht im moment so aus:

Die GUI Klasse
Code:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class GUI
extends JFrame
{
	private GUI gui=null;	
	private JButton bsync=new JButton();
		
	// Statusleiste
	JLabel lstatus=new JLabel();
	
	public GUI()
	{
		super("Palm-Sunbird-Syncronisation");

		gui=this;
		
		JPanel panel=new JPanel();
		panel.setLayout(null);

		// Positionieren des Buttons
		bsync.setBounds(120, 53, 60, 32);
		bsync.setIcon(new ImageIcon(getClass().getResource("sync.gif")));

		// Positionieren der Statuszeile
		lstatus.setBounds(0, 95, 220, 20);

		panel.add(bsync);
		panel.add(lstatus);

		lstatus.setText("bereit...");
		
		Container contentPane=getContentPane();
		contentPane.add(panel);
				
		// Listener für den Sync-Button
        bsync.addActionListener(new ActionListener()
        {
           public void actionPerformed(ActionEvent e)
           {
        	   // Quelldaten aus dem Palm bzw. Sunbird
        	   ArrayList<DatasetPDA> source_PDA=null;

 		PDA pda01=new PDA(tfppath.getText(),gui);      			
           }
        });

        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
            	System.exit(0);
            }
        }); 
	}
	
	// Setzen des Textes für die Statuszeile
	public void setStatusbar(String text)
	{
		lstatus.setText(text);     // <-- hier sollte eigentlich das Label aktualisiert werden....
	}
}

Die Klasse PDA:
Code:
import java.io.*;
import java.text.*;
import java.util.*;
import javax.swing.*;

public class PDA
{
	GUI gui=null;
	
	public PDA(String port, GUI gui)
	{
		File fp=new File(port);
		int timer=50;
		
		this.gui=gui;
						
		System.out.println("Überprüfung auf die Existenz des Devices");
		
		// Falls das Device nicht existiert
		// (Das Device wird nach dem drücken des HotSync-Knopfes erzeugt)
		if(!fp.exists())
		{			
			// Suche 50 Sekunden lang nach dem Device
			while(!fp.exists() && timer!=0)
			{
				try
				{
					System.out.print(".");
					Thread.sleep(1000);
					timer--;
					
					gui.setStatusbar("foo");    // <---- gui.setStatusbar wird ordnungsgemäß aufgerufen
				}
				catch(Exception e)
				{
				}
			}			
		}
//...

Ich wäre über einen kleinen HInweis warum er zwar die Methode aufruft und auch den Wert übernimmt, er es aber nicht hinbekommt das Label zu aktualisieren sehr dankbar.
Viele Grüsse
Dan
 
S

SlaterB

Gast
lokal gehts, über alles andere läßt sich schwerlich diskutieren..

prüfe mit System.out.println ob der jeweilige Code überhaupt ausgeführt wird,
prüfe mit der Ausgabe von hashCode(), ob du die richtigen Objekte ansprichst,

hat die GUI überhaupt Zeit, sich neu zu zeichnen?
laufen andere Arbeiten nebenbei nicht in ausgelagerten Threads?

Code:
public class GUI
    extends JFrame
{
    private GUI gui = null;
    private JButton bsync = new JButton();

    // Statusleiste
    JLabel lstatus = new JLabel();

    public GUI()
    {
        super("Palm-Sunbird-Syncronisation");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui = this;

        JPanel panel = new JPanel();
        panel.setLayout(null);

        // Positionieren der Statuszeile
        lstatus.setBounds(0, 95, 220, 20);

        panel.add(bsync);
        panel.add(lstatus);

        lstatus.setText("bereit...");

        Container contentPane = getContentPane();
        contentPane.add(panel);

        // Listener für den Sync-Button
        bsync.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {

                }
            });

        addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                    System.exit(0);
                }
            });
        setSize(500, 500);
        setVisible(true);
        new PDA(null, this);
    }

    // Setzen des Textes für die Statuszeile
    public void setStatusbar(String text)
    {
        lstatus.setText(text); // <-- hier sollte eigentlich das Label aktualisiert
        // werden....
    }

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


class PDA
{
    GUI gui = null;

    public PDA(String port, GUI gui)
    {
        this.gui = gui;
        try
        {
            System.out.print(".");
            Thread.sleep(3000);

            gui.setStatusbar("foo");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
 

Marco13

Top Contributor
Eine mögliche Erklärung (von vielen) wäre, dass das PDA im Event-Dispatch-Thread erstellt wird - z.B. in der actionPerformed-Methode eines Buttons. Also falls du sowas hast wie
Code:
    // Wird aufgerufen, wenn irgendein "start-button" gedrückt wurde
    public void actionPerformed(ActionEvent e)
    {
        new PDA(...);
    }
dann leg die Erzeugung in einen eigenen Thread
Code:
    // Wird aufgerufen, wenn irgendein "start-button" gedrückt wurde
    public void actionPerformed(ActionEvent e)
    {
        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
                 new PDA(...);
            }
        });
        t.start();
    }
Falls es möglich ist, könnte das PDA auch (in Anlehnung an SlaterB's Post) außerhalb des Event-Dispatch-Threads erstellt werden...
 

hawkeye78

Bekanntes Mitglied
Hallo,

erst einmal vielen dank für eure schnelle Hilfe und die Lösungsvorschläge allerdings ergeben sich ein paar Probleme damit:

@ SlaterB
ich glaube das Auslagern des Befehls "new PDA()" kann ich nicht machen da im Konstruktur versucht wird eine Verbindung zu einem externen Gerät (halt meinem Hand-Hold) aufzubauen, und das soll halt erst passieren wenn ich in der Oberfläche auf den Button drücke.

@Marco13
nein ich benutze eigentlich in der Klasse PDA den Thread nur dafür das die Schleife 50 Sekunden wartet und bei jedem durchlauf nachschaut ob das Device mittlerweile vorhanden ist (das Device wir nur erzeugt wenn ich am PDA selbst eine Taste drücke). Darum glaube ich irgendwie nicht das mit dem Thread zusammehängt (zumindestens nicht direkt). Ansonsten habe ich halt das Problem was ich schon bei bei SlaterB beschrieben habe das ich auf jeden Fall das Objekt erst im ActionListener erzeugen darf/kann.

Trotzdem noch einmal vielen dank für eure Hilfe.
Viele Grüsse
Dan
 
S

SlaterB

Gast
erstelle doch mal ein vollständiges lokales Programm. so wie es bei dir abläuft,
versuche alle Remote-Verbindungen durch Thread-sleep() oder ähnlich irrelevantes zu simulieren/ ersetzen,
kürze das Programm soweit wie möglich solange der Fehler noch auftriff
 

hawkeye78

Bekanntes Mitglied
Hallo SlaterB,

ich habe deinen Rat mal befolgt und das Programm soweit wie es irgendmöglich ging zusammen gekürtzt. Ich hatte dafür den GUI-Entwurf genommen den Du oben gemacht hattest und dann die Klasse PDA wie folgt angepaßt:

Code:
public class PDA
{
	public PDA(GUI g1)
	{
		g1.setStatusbar("foobar");
		int timer=5;
		
		while(timer!=0)
		{
			timer--;
			try
			{
				Thread.sleep(1000);
			}
			catch(Exception e)
			{
			
			}
			System.out.println(timer);
		}
	}
}

Nach meinem Verständnis sollte er erst die Methode g1.setStatusbar("foobar"); aufrufen und danach in die Schleife laufen und diese 5 Sekunden lang (5 Durchläufe mit jeweils 1 Sekunde pause dazwischen) durchlaufen.
Vielleicht hast du (oder jemand anders der das liest) eine Idee wie man es umsetzen kann das er am Anfang den Status in "Gerät wird gesucht" ändern kann und dann jeweils einen Fortschrittsbalken innerhalb der Schleife langsam "füllen" kann.
Ich wäre über einen entsprechenden Hinweis auf jeden Fall sehr dankbar, da sich dieses irgendwie meiner Logik entzieht. Auch aufgrund der Tatsache das er egal wie lang die Pausen sind das Label immer erst nach dem schleifendurch laufe aktualisiert.
Viele Grüsse
Dan
 
S

SlaterB

Gast
erstens ist es immer noch wichtig, wer (wo) das Objekt erzeugt (wird),
in einerm Listener, also vom AWT-Thread?

dann wurde ja schon oft genug darauf hingewiesen:
solche lang andauernde Logik gehört in einem eigenen Thread,
damit der AWT-Thread wieder wichtiges tun kann (die GUI zeichnen)
 

hawkeye78

Bekanntes Mitglied
Guten Morgen SlaterB,

ich habe nun die Schleife in eine eigene eigene Thread-Methode ausgeglagert. NUn macht er aber leider immer noch nicht das was ich mir so wünsche. Ich hatte bei dem Quellcode eigentlich die Hoffnung das er mir nun jeweils in der Schleife den Wert von der Variable Timer aufs Label schreibt. Aber ich habe wohl immer noch irgendwie einen Denkfehler drin. Mein Quellcode schaut im moment so aus:

Code:
public class PDA
extends Thread
{
	GUI g2=null;
	public PDA(GUI g1)
	{
//		g1.setStatusbar("foobar");
		g2=g1;
		
		Thread t1=new Thread();
		t1.start();
		
	}
	
	public void run()
	{
		int timer=5;
		String temp="";
		
		while(timer!=0)
		{
			timer--;
			try
			{
				sleep(1000);
				g2.setStatusbar(temp.valueOf(timer));
			}
			catch(Exception e)
			{
			
			}
			System.out.println(timer);
		}
	}
}
 
S

SlaterB

Gast
was soll denn
Thread t1=new Thread();
t1.start();
bewirken?

und wie wird in dem Fall run() aufgerufen, machst du das etwa selber?

so gehts eher:
Code:
public class PDA 
extends Thread 
{ 
   GUI g2=null; 
   public PDA(GUI g1) 
   { 
//      g1.setStatusbar("foobar"); 
      g2=g1; 
       start(); // sich selbst starten! nicht einen anderen Thread
       
   } 
    
   public void run() 
   { 
      int timer=5; 
      String temp=""; 
       
      while(timer!=0) 
      { 
         timer--; 
         try 
         { 
            sleep(1000); 
            g2.setStatusbar(temp.valueOf(timer)); 
         } 
         catch(Exception e) 
         { 
          
         } 
         System.out.println(timer); 
      } 
   } 
}

bzw. kannst PDA auch so lassen wie es ist, siehe Post von Marco13,
einfach den Code des ActionListeners in einem unverbindlich spontan erzeugten Thread ausführen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Abstand zwischen AnchorPane und Labels in dem HBox halten AWT, Swing, JavaFX & SWT 1
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
S Labels abfragen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
K Swing labels anpassen AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Gui-Form alle Labels anzeigen AWT, Swing, JavaFX & SWT 4
Z Window Builder - Labels mit setText befüllen AWT, Swing, JavaFX & SWT 11
X Swing Per Button die Labels und Textfelder auslesen AWT, Swing, JavaFX & SWT 8
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Buttons/Labels auf GUI positionieren AWT, Swing, JavaFX & SWT 2
X Swing setContentPane verdeckt mir alle Buttons Labels etc... AWT, Swing, JavaFX & SWT 14
D Wie kann ich Buttons und Labels besser anordnen AWT, Swing, JavaFX & SWT 4
V JTabbedPane Eingefügte Labels verschoben AWT, Swing, JavaFX & SWT 2
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
K Hilfe bei Labels AWT, Swing, JavaFX & SWT 3
K richtiges Ausrichten mehrerer Labels AWT, Swing, JavaFX & SWT 3
R Größe eines Labels bei GridBagLayout festlegen AWT, Swing, JavaFX & SWT 9
alex_fairytail LayoutManager NullLayout überlappende Labels werden nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Swing Positionierung eines Labels in einem Panel AWT, Swing, JavaFX & SWT 2
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
A Swing JFrame vergrößert sich immer bei setText() eines Labels AWT, Swing, JavaFX & SWT 3
D LayoutManager GridLayout, 2 labels nebeneinander AWT, Swing, JavaFX & SWT 8
B bin am verzweifeln, will auf knopfdruck durch ne überprüfung die labels unsichtbar machen AWT, Swing, JavaFX & SWT 2
K Swing Labels & Buttons auf Frame AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
M AWT TextFelder und Labels nicht ausgerichtet AWT, Swing, JavaFX & SWT 6
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
N Formular mit GridBaglayout und Abstände von Labels AWT, Swing, JavaFX & SWT 2
M Labels in ScrollPane mit Linie verbinden AWT, Swing, JavaFX & SWT 2
P SWT Composite und viele Labels AWT, Swing, JavaFX & SWT 10
G Frage zu Labels mit html AWT, Swing, JavaFX & SWT 3
S Labels und Button übereinander --> Reihenfolge? AWT, Swing, JavaFX & SWT 4
G Text eines Labels verändern? AWT, Swing, JavaFX & SWT 4
G Button vor Labels? AWT, Swing, JavaFX & SWT 5
T Warum nehmen diese Labels die Hintergrundfarbe nicht an? AWT, Swing, JavaFX & SWT 6
T Labels gleichzeitig bewegen und anklicken AWT, Swing, JavaFX & SWT 3
S Position von Labels, Buttons, etc. festsetzen und Scrollen AWT, Swing, JavaFX & SWT 4
A Zeichnen auf zwei Labels. Geht nit AWT, Swing, JavaFX & SWT 7
D Zurücksetzen des Labels funtioniert nicht AWT, Swing, JavaFX & SWT 6
Landei Labels in Box linksbündig ausrichten AWT, Swing, JavaFX & SWT 15
P Hintergrund eines Labels/Panels setzen AWT, Swing, JavaFX & SWT 3
G der sinn von labels/jlabels ? AWT, Swing, JavaFX & SWT 3
L Labels verschwinden! AWT, Swing, JavaFX & SWT 10
D JPanlels und Labels. AWT, Swing, JavaFX & SWT 7
T Labels verschieben / Flackern AWT, Swing, JavaFX & SWT 2
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
M Getter und Setter AWT, Swing, JavaFX & SWT 9
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
P keyTyped-Methode AWT, Swing, JavaFX & SWT 1
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S PaintIn - Methode AWT, Swing, JavaFX & SWT 1
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben