JLabel aktualsisieren während Verarbeitung

M

Mike78

Gast
Hallo,

im Rahmen eines meiner ersten Swing Programme möchte ich ein JLabel als Statusanzeige/Statusbar verwenden.

Nach einem Klick auf einen Button werden also rechenintensive Methoden ausgeführt, während derren das Status JLabel geändert wird.

Also

Java:
//starten
JLabel jlState=new JLabel();
jlState.setText("Beginne Verarbeitung...");
this. revalidate();
this.repaint();
//methodenausführen
jlState.setText("Nächster Schritt");
this. revalidate();
this.repaint();
//weitere methoden...
//etc

Ich habe das Problem, dass die geänderten JLabel Texte nicht während der Verarbeitung angezeigt werden, sondern erst wenn die Verarbeitung abgeschlossen ist. Die GUI wird also nur verzögert aktualisiert.

Wie kann ich es erreichen, dass die Verarbeitung soweit "pausiert" wird, dass die veränderten JLabel Texte direkt angezeigt werden, auch während der Verarbeitung und nicht erst am Ende?

Ich würde also gerne eine Art Delay einführen und den Mauszeiger zur Sanduhr machen sowie die JLabel Texte zeitnah anzeigen, damit es nicht so aussieht, dass das ganze hängt, bis die Verarbeitung abgeschlossen ist.
 

pl4gu33

Top Contributor
is vll. nicht so schön, aber auf die schnell fällt mir das dazu ein : ;)
(evtl. ne Ladebalken Animation dazu, dann siehts auch nicht aus wie hängen geblieben :)
aber gibt bestimmt schönere Lösungen ;))
Java:
	public static void main(String[] args){
		JFrame frame=new JFrame("");
		JPanel panel=new JPanel();
		JLabel lbl=new JLabel("TEST");
		frame.setSize(200, 400);
		frame.setVisible(true);
		panel.add(lbl);
		frame.add(panel);
		try {
			Thread.sleep(1000);
			lbl.setText("HALLO");
			Thread.sleep(1000);

			lbl.setText("HAL");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
 
M

Mike78

Gast
Also thread.sleep() hilft leider nicht weiter:

Java:
            Thread.sleep(1000);
            

            lbl.setText("nächster status");

            this.revalidate();
            this.repaint();

            Thread.sleep(1000);

Die Anzeige des gesamten Fensters hängt und wird nicht aktualisiert, bis die Verarbeitung abgeschlossen ist.
Hat noch jemand eine Idee?
 
S

SlaterB

Gast
im Beispiel von pl4gu33 ist übrigens die main-Methode/ der main-Thread dieser benötigte separate Thread, daher funktioniert das,
aus einem Listener heraus gehts ohne neuen Thread kaum
 

turtle

Top Contributor
Ich mache das Auslagern in einen separaten Thread immer mit einem SwingWorker.

Hier ein kleines Beispiel, dass automatisch die Uhrzeit im Label aktualisiert, aber Du kannst da natürlich machen, was Du magst.
Java:
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;

public class JLabelTimer {
	public static void main(String[] args) {
		JFrame frame = new JFrame("Label");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		final JLabel test = new JLabel("Time");
		final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
			public Void doInBackground() {
				while (true) {
					try {
						Thread.sleep(1000);
						String text = sdf.format(new Date());
						test.setText(text);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

			public void done() {
			}
		};
		worker.execute();
		panel.add(test);
		frame.add(panel);
		frame.pack();
		frame.setVisible(true);
	}
}
 
M

Mike78

Gast
Also ich habs nun mit einem separeten Thread wohl etwas hemdsärmlich probiert:

So ungefähr:

Java:
class testframe extends frame implements runnable {

p 
Thread statusThread = new Thread(this);
statusThread.start();

@Override
    public void run() {
        while (true) {
   
              );
                
                
                this.revalidate();
                this.repaint();

              
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                newState = false;
            //}
        }
    }
}
 
S

SlaterB

Gast
besteht noch eine Frage? eindeutige Posts wären besser

der Code sieht nicht sehr kompilierbar aus
 
M

Mike78

Gast
Also ich habs nun mit einem separeten Thread wohl etwas hemdsärmlich probiert:

So ungefähr:

Java:
class testframe extends frame implements runnable {

private string text="";
private LLabel statuslabel=new JLabel();

public testframe()  {
        Thread statusThread = new Thread(this);
         statusThread.start();

}

@Override
    public void run() {
        while (true) {
   
              );
                
                System.out.println(text);

                statuslabel.setText(text);
                this.revalidate();
                this.repaint();

              
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
            
        }
    }
}

public void statusanzeigen(String t){
this.text=t;
}

Ich rufe die statusanzeigen Methode extern auf, das funktioniert.
Allerdings ist es so, dass das System.out zwar angezeigt wird, aber denoch die GUI nicht aktualisiert wird während der Verarbeitung, das JLabel also nicht rechtzeitig neu angezeigt wird. Erst wenn die Verarbeitung abgeschlossen ist. Wie kann das sein?

Noch eine Frage: ist das sehr ressourcenfresesnd mit dem parallelen Thread?
Ich würde noch eine Boolean einfügen mit neuerStatus=true und nur dann die neuen Werte setzen, damit es nicht so ressourcenhungrig ist.

Was meint ihr?
 
S

SlaterB

Gast
> Noch eine Frage: ist das sehr ressourcenfresesnd mit dem parallelen Thread?
grundsätzlich vertretbar, du läßt schon ca. mit Arbeitsfaktor 10 die GUI laufen,
nochmal Faktor 1 oben drauf damit das passiert was dein Ziel ist, ist nicht falsch

natürlich kann man auch einen Thread falsch langsam programmieren,
dein Code ist nicht kompilierbar, weder der Fehler noch evtl. schlechte Umsetzung sind zu erkennen,

vervollständigt auf folgenden Code sieht es für mich funktionierend aus
Java:
public class Test
{
    public static void main(String[] args)
    {
        new testframe();
    }
}

class testframe   extends JFrame  implements Runnable
{
    private String text = "";
    private JLabel statuslabel = new JLabel();

    public testframe()
    {
        add(statuslabel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 300);
        setVisible(true);
        
        Thread statusThread = new Thread(this);
        statusThread.start();
    }

    public void run()
    {
        while (true)
        {
            text = "" + Math.random();
            System.out.println(text);
            statuslabel.setText(text);
            try
            {
                Thread.sleep(1000);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}
 
M

Mike78

Gast
So, also jetzt funktionierts!

Habe nicht nur die Anzeige des Labels sondern die gesamte Verarbeitung der Methoden, die die "Last" erzeugen in einen Thread ausgegliedert, so dass die GUI (das Label) immer aus diesem Thread heraus aktualisiert wird.

Danke!
 
M

Mike78

Gast
Jetzt noch zwei Anschlussfragen, wenn auch OT:

Während der Verarbeitung soll nun das gesamte Fenster (jframe) mit all seinen Elementen disabled gesetzt werden, damit der User nichts macht.

Kann es sein, dass das mit jframe.setEnabled(false) nicht funktioniert, da die Kinder unabhängig davon sind?

Ich habe nun einzelne Elemente, z.b. einen Jtree der ein Kind des JFrames ist, disabled, aber dann gehen z.B. noch kontextmenüs auf dem JTree, wie ich sehe.

Gibts eine Möglichkeit ein Fenster und alle seine Kinder disabled zu setzen, dann inkl Kontextmenüs?
Oder muss ich das alles einzelne bearbeiten...

Zweite Frage: ich würde den Mauszeiger zur Sanduhr machen mit:

tp.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

Wenn ich das auf dem TabbedPane (tp) ausführe, in dem ich mich befinde, klappt das nicht, es passiert einfach nichts mit dem Mauszeiger.
Muss ich das auf dem jFrame ausführen?
 
S

SlaterB

Gast
Cursor entweder ganz oben oder ganz unten auf den angezeigten JPanel + Komponenten,
TabbedPane bring vielleicht am wenigsten,
gibt es keine kompletten Beispiele im Internet?

ein modaler Dialog ist eine Möglichkeit, ein JFrame sperren
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C Swing Übergabe von String an JLabel AWT, Swing, JavaFX & SWT 9
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
D JLabel übereinanderlegen AWT, Swing, JavaFX & SWT 5
E JLabel kopieren AWT, Swing, JavaFX & SWT 31
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
E JLabel AWT, Swing, JavaFX & SWT 1
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
L JLabel ist verzerrt/größer als eingestellt AWT, Swing, JavaFX & SWT 15
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L Kalendar als JLabel einfügen AWT, Swing, JavaFX & SWT 3
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
P Aktualisierung von jLabel in jFrames AWT, Swing, JavaFX & SWT 8
DaCrazyJavaExpert Swing JLabel Klickanimation AWT, Swing, JavaFX & SWT 4
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
M JLabel ausrichten AWT, Swing, JavaFX & SWT 2
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
T JLabel Textinhalt von Oben anzeigen AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
T JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
F Abgeleitetes JLabel AWT, Swing, JavaFX & SWT 16
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
S jLabel HTML Formatierung AWT, Swing, JavaFX & SWT 2
J Statisches JLabel adden AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
T JLabel in die Mitte(JLabel.CENTER geht nicht) AWT, Swing, JavaFX & SWT 12
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
K Swing unterschied JTextField und JLabel AWT, Swing, JavaFX & SWT 7
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
E JLabel aus Runnable ändern AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
F Swing JLabel wird nicht sofort Angezeigt AWT, Swing, JavaFX & SWT 3
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
GreyFox JLabel in laufender Anwendung erzeugen AWT, Swing, JavaFX & SWT 6
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
Z Auf ein JLabel drauf malen? AWT, Swing, JavaFX & SWT 1
S JLabel in den Vordergrund rücken AWT, Swing, JavaFX & SWT 1
A JLabel hochzählen lassen. AWT, Swing, JavaFX & SWT 6
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
S JLabel anordnen AWT, Swing, JavaFX & SWT 2
J ungewollt-automatische Größenänderung von JLabel AWT, Swing, JavaFX & SWT 5
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
B Swing JLabel und LayoutManager AWT, Swing, JavaFX & SWT 20
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
O Statusleiste mit JLabel aktualisieren AWT, Swing, JavaFX & SWT 5
G jLabel aus anderem Fenster ändern AWT, Swing, JavaFX & SWT 7
T JLabel Nullpunkt verschieben AWT, Swing, JavaFX & SWT 6
F Swing JPanel mit JLabel spinnt? AWT, Swing, JavaFX & SWT 2
M Massenweise JLabel ? oder ? AWT, Swing, JavaFX & SWT 3
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
G JLabel verdeckt AWT, Swing, JavaFX & SWT 12
A JLabel zeichendicke einstellen AWT, Swing, JavaFX & SWT 3
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
S jLabel / jText beim starten ausblenden AWT, Swing, JavaFX & SWT 2
A Array von JLabel mit Grafiken anzeigen AWT, Swing, JavaFX & SWT 3
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
A JLabel im Listener färben AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
SexyPenny90 JLabel liegt unter meiner Turtle AWT, Swing, JavaFX & SWT 5
V JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben