JLabel will nicht "fliegen"

Status
Nicht offen für weitere Antworten.
Hallo,
ich bin Neuling in Swingprogrammierung mit NetBeans55 und Java 1.6 und will ein kleines Spiel machen. Ein JLabel habe ich testweise, das bei Buttondruck problemlos seine randomisierte Location ändern kann.
Will ich dies jetzt in einer Schleife einfach mal scheinbar "fliegen" lassen (auf dem Frame bzw. Panel) passiert nichts - es bleibt stehen.
(Es liegt auf einem JPanel, das in einem Frame plaziert ist.)
Was ist der Fehler?

Codeauszug: (Hier hatte ich vorher die randomisierten Stellen, die funktionierten)

Code:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// TODO add your handling code here:
            for (int i=1; i<100; i++)   {
                jLabel3.setLocation(100, 100+i);          
            }
 }


Main-Class wie gewöhnlich durch NetBeans vorcodiert:
Code:
    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new mainframe().setVisible(true);
            }   
        });       
        System.out.println("123");
    }

Wie kann generell etwas wie ein JLabel am laufen halten und dabei reagieren, wenn z.B. eine Texteingabe ausgeführt wird?
Sollte jemand eine Quelle kennen, wo solch etwas gezeigt wird, wäre ich dankbar für die Adresse. In den ganzen Sun-Tutorials wird darauf nicht wirklich eingegangen oder habe es übersehen...

Danke für Hilfe,
bs
 
G

Gast2

Gast
mit einem thread...
und wenn du ein JPnael verwendest dann sollest du auch ein JFrame verwenden und kein Frame
 
Meine Klasse ist auf einem JFrame aufgebaut; der ist nur mainframe getauft.
public class mainframe extends javax.swing.JFrame {
...
}
 
Ich habe nun eine Klasse für testweise einen Thread - wie komme ich an die Komponenten wie das JLabel aus der anderen Klasse?
Soll ich die Klasse mainframe auch in die andere Klasse einbinden? Die würden sich gegenseitig einnehmen.
 

DocRandom

Top Contributor
Hallo buecherschrank!

Ich habe Dein Beispiel kurz nachvollzogen und bin zu folgendem Ergebnis gekommen:

Einmal die Thread-Klasse:
Code:
/*
 * Worker.java
 *
 * Created on 26. Oktober 2007, 21:26
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package buecherschrank;

import java.util.Random;
import javax.swing.JLabel;

/**
 *
 * @author aco
 */
public class Worker extends Thread{
    
    private int steps;
    private JLabel lable;
    private Random rd = new Random();
    
    /** Creates a new instance of Worker */
    public Worker(int steps, JLabel lable) {
        this.steps = steps;
        this.lable = lable;
    }
    public void run() {
        int i = 0;
        while (i < steps) {
            lable.setLocation(100, i++);
            try {
                sleep((rd.nextInt(5)+1)*100);
            }catch(InterruptedException iex) {
                // was auch imme Du machen willst beim Interrupt
            }
        }
    }    
}
Du übergibst der Klasse die Anzahl der Durchläufe(steps) und Dein Lable(JLable)
Das wars auch dann schon.
Im Code-Teil des Formulares mußt Du nur noch:
Code:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
        Worker wk = new Worker(100,jLabel1);
        wk.start();
    }
einfügen!

das wars dann!

lg
DocRandom
 

Wildcard

Top Contributor
nicht ganz. Das muss mit dem EDT synchronisiert werden, sprich SwingUtilities#invokeLater :wink:
 

DocRandom

Top Contributor
..also bei mir läufts!
Wobei Du könntes schon recht haben, ich mache ja sonst nix mit Swing, bzw GUI ;)

lg
DocRandom
 

Wildcard

Top Contributor
Es läuft immer so lange bis es durch den QA Test ist und beim Kunden läuft :wink:
Spaß beiseite, natürlich läuft das in 99,9% aller Fälle, aber so ist das nunmal mit Threading Issues.
 

Wildcard

Top Contributor
I müsste dann als Member deklariert werden...
Code:
	    while (i < steps) {
			SwingUtilities.invokeLater(new Runnable() {
				
				@Override
				public void run() {
					lable.setLocation(100, i++);
			
				}
			
			});
	        
	        try {
	            sleep((rd.nextInt(5)+1)*100);
	        }catch(InterruptedException iex) {
	            // was auch imme Du machen willst beim Interrupt
	        }
	    }
 
G

Gast2

Gast
kurze frage für was ist das Synchronisieren notwendig bzw. warum wird es gebraucht??
 

André Uhres

Top Contributor
Threads in Swing
  1. Die drei Threadarten
    In Swing Anwendungen unterscheidet man drei Threadarten:
    • Initial Thread, wo der den Anwendungscode beim Starten läuft.
    • Event Dispatch Thread, wo der Event-handling Code ausgeführt wird.
      Der meiste Code, der mit dem Swing Framework arbeitet,
      muss ebenfalls auf diesem Thread laufen.
    • Worker Threads, auch Background Threads genannt,
      wo zeitaufwendige Hintergrundprozesse ausgeführt werden.
  2. Der Event Dispatch Thread (EDT)
    Im Event Dispatch Thread (kurz EDT) sollten immer nur sehr kurze Prozesse laufen,
    sonst wird die GUI blockiert. Alles, was die GUI verändert gehört auf diesen Thread.
    Mit invokeLater (oder invokeAndWait) kannst du einen Prozess auf den EDT schicken.
  3. Der Programmstart
    Beim Programmstart sollte die GUI immer auf dem EDT gestartet werden (invokeLater).
    Da die Swing Events von Natur aus auf dem EDT laufen, läuft danach alles automatisch auf dem EDT,
    ausser wenn die Anwendung einen speziellen Worker Thread startet.
    Beispiel für den sicheren Start einer Swing Anwendung:
    Code:
    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
  4. Einige "thread-safe" Methoden
    Einige Swing Methoden sind thread-safe und können von jedem Thread aufgerufen werden.
    In der API Dokumentation steht dann: This method is thread safe, although most Swing methods are not.
    Beispiele: JComponent#repaint(), JComponent#revalidate(), JTextComponent#setText(), ...
  5. Mehr Infos
    Siehe Concurrency in Swing
    [/list:eek::dd2bc9444a]
 
Hallo zusammen,
erstmal großen Dank an DocRandom. Ich muss gestehen, ich brauchte einige zeit, um das zu kapieren (ich hatte vorher mit Threads nichts am Hut) - aber jetzt klappts.
Auch die sleep Funktion ist eine große Hilfe.
mit Threads ging bereits ich in eine ganz andere Richtung... alles gelöscht.. war nutzlos.
Auch Wildcards Synchronisation klappt.
Gruß,
bs
 
G

Gast2

Gast
@ Andres Uhres ok alles klar , dass ist gut zu wissen...
Ein Beispiel bzw Frage dazu. z.B. ich will jetzt (aus welchem Grund auch immer ) ein JLabel die ganze zeit anders platzieren lassen ohne Ende... dann schicke ich dass ja nicht auf den EDT sonst ist ja die restliche GUI geblockt oder????? Oder z.B. wenn ich eine Bildabfolge ablaufen lassen will in einem JPanel , dachte ich bis jetzt immer dass ich einen ganz normalen Thread verwende ohne invokeLater wie es beim 1.Beispiel von docRandom gemacht wurde ...
 

DocRandom

Top Contributor
Hi SirWayne!

..also wie ich das verstanden habe, teilst Du nur dem EDT mit, das er auch Deine Thread-Zeitscheibe mitverwalten soll, damit es zu keiner Blochade der GUI kommt.

Wenn nicht, bitte um Berichtigung @André Uhres ;)

lg
DocRandom
 

Wildcard

Top Contributor
Nein, das ist falsch. Der Thread hat in diesem Fall primär jedoch einen Zweck: zu schlafen.
Alles was direkt oder indirekt die GUI verändert (mit ganz wenigen threadsicheren Ausnahmen) muss aus dem EDT erfolgen. Daher wird die eigentliche Aufgabe, das setzen der Position, über die SwingUtilites in die Queue des EDT geschoben und von diesem verarbeitet.
Wird die GUI von einem anderen Thread beeinflußt ist das Verhalten undefiniert.
 
G

Gast2

Gast
mhm o.k !!! Aber =) wie gesagt, wenn ich jetzt viele Bilder hintereinander auf einem Panel ablaufen(zeichnen) lassen will und dieser Ablauf sich endlos wiederholen soll bis ein Panelwechsel satt findet. Nehmen wir einmal mal wir wollen das Panel durch einen Buttondruck wechseln.Wenn ich dann das schlafen legen dieses Thread in den EDT schiebe, wird dann die restliche GUI blockiert,w eil der EDT ja die ganze zeit meinen thread verwalten muss und damit beschäftigt ist meine Bilder zu zeichnen.... oder kann der EDT in meinem beispiel immer noch auf den Buttondruck reagieren???

Hoffe meine Frage ist verständlicher =)

EDIT: Mit Punktation =)
 
G

Gast2

Gast
ja des denk ich mir aber irgendwie ich versteh das nicht...
Also es ist mir soweit bewusst, dass der EDT alles was mit der GUI zu tun hat machen soll...
ABER was ist wenn der Code so aussehen würde

Code:
while (true)

i=i+10;
       SwingUtilities.invokeLater(new Runnable() { 
             
            @Override 
            public void run() { 
               lable.setLocation(100, i); 
          
            } 
          
         });

...

also es ist ja jetzt eine endlosschleife ... meine frage : Ist die GUI jetzt blockiert z.B. Buttons ????
 

DocRandom

Top Contributor
..hm heißt das:
wenn ich bei der GUI-Programmierung innerhalb eines Events einen oder mehrere Threads aufrufe, das ich dann Gefahr laufe den EDT zu blockieren, wenn ich kein
Code:
SwingUtilities.invokeLater(new Runnable()
einbaue?
Hab ich das jetzt richtig verstanden?

Edit: natürlich nur Threads die mit der GUI zu tun haben, oder betrifft das alle Threads?
lg
DocRandom
 
G

Gast2

Gast
ah ok ich glaub jetzt hab ich es des invokelater() zeichnet nur das label an eine andere position und durch das invokelater wird es im EDt thread abgeabreitet und nicht im normalen thread...
 

DocRandom

Top Contributor
..ahh, thx SirWayne jetzt hab ichs auch kapiert *fg*
Sollte mich doch mal mit der GUI etwas näher auseinandersetzen!

lg
DocRandom
 
G

Gast2

Gast
ja ich bin mir gar nicht sicher ob meine Aussage stimmt =)!!!! @wildcard hab ich es richtig verstanden oder net???
 

Wildcard

Top Contributor
Passt schon so. Nur das setLocation noch nichts zeichnet, sondern nur die Position verändert.
Das eigentliche Zeichnen übernimmt der RepaintManager seperat, aber das hat mit der Sache schon nichts mehr zu tun.
 
G

Gast2

Gast
Eine frage zu der Sache hätte ich noch!!! Wenn ich in meiner Anwendung per buttondruck eine neues JTabbedPane anlege und auf den container adde, muss ich dann in meiner actionPerformed methode auch die SwingUtilities.invokelater() aufrufen ????

Code:
	public void actionPerformed(ActionEvent ae) 
	{
		if(ae.getSource().equals(button))
		{
			vewaltung=new JTabbedPane();
			SwingUtilities.invokeLater(new Runnable(){
	            public void run(){
	            	vewaltung.addTab("Panel1",panel1);
                                ....
	            	add(vewaltung);
	            	container.repaint();
	            }
	        });

            }
 

Wildcard

Top Contributor
EDT = Event Dispatcher Thread
Ein ActionEvent ist augenscheinlich ein Event
Ergo: Der Code wird bereits vom EDT ausgeführt.
 
G

Gast2

Gast
ok klingt logisch ...
und was wäre wenn man den Code im Konstruktor ausführt??? mit oder ohne invokeLater()???


Code:
public class TestFrame extends JFrame
{

JPanel panel1;
JTabbedPane verwaltung;
...

    public TestFrame()
    {
    panel1=new JPanel();

    ...
      vewaltung=new JTabbedPane(); 
         SwingUtilities.invokeLater(new Runnable(){ 
               public void run(){ 
                  vewaltung.addTab("Panel1",panel1); 
                                .... 
                  add(vewaltung); 
            
               } 
           }); 
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
T JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
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
F Swing JLabel wird nicht sofort Angezeigt AWT, Swing, JavaFX & SWT 3
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
V JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
J Swing Bild wird nicht auf JLabel angezeigt AWT, Swing, JavaFX & SWT 12
S Swing JLabel wird in JPanel nicht sichtbar AWT, Swing, JavaFX & SWT 2
C Swing JLabel nicht angezeigt AWT, Swing, JavaFX & SWT 3
S JLabel mit imgIcon wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
C JLabel wird nicht aktualisiert AWT, Swing, JavaFX & SWT 3
S Anfänger - JFrame/JLabel nicht sichtbar AWT, Swing, JavaFX & SWT 5
P LookAndFeel nimbus JLabel undurchsichtig opaque funktioniert nicht AWT, Swing, JavaFX & SWT 4
D JLabel wird nicht neugezeichnet, sondern übergezeichnet AWT, Swing, JavaFX & SWT 4
W JLabel-Text ab best. Zeitpunkt nicht mehr verändern AWT, Swing, JavaFX & SWT 2
R JLabel-Text wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
N JLabel Text aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
P Swing JLabel Text nach Links ausrichten klappt nicht AWT, Swing, JavaFX & SWT 3
A JLabel und Zeilenumbruch - Nicht das Übliche AWT, Swing, JavaFX & SWT 4
G JLabel Text nicht fett AWT, Swing, JavaFX & SWT 1
R das letzte JLabel in der Schleife will nicht an seinen Platz AWT, Swing, JavaFX & SWT 2
S n-e-w JLabel(n-e-w ImageIcon(i)) funkt. nicht im JScrollPane AWT, Swing, JavaFX & SWT 2
S JLabel aktualisiert sich nicht AWT, Swing, JavaFX & SWT 4
G Warum funktioniert html in JLabel nicht ? AWT, Swing, JavaFX & SWT 3
C JLabel - setBounds wird nicht übernommen AWT, Swing, JavaFX & SWT 3
S Text im JLabel wird nicht als null anerkannt AWT, Swing, JavaFX & SWT 4
K JLabel wird nicht ge-updated AWT, Swing, JavaFX & SWT 2
M JLabel nicht sichtbar AWT, Swing, JavaFX & SWT 11
B JLabel wird nicht angezeigt (bin verzweifelt!) AWT, Swing, JavaFX & SWT 7
R nach setSize() wird JLabel nicht dargestellt AWT, Swing, JavaFX & SWT 3
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
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
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
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
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
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
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
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

Ähnliche Java Themen

Neue Themen


Oben