repaint() mag mal wieder nicht.

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey,

ich habe ein Panel, das als Komponenten weitere Panels hat. Beim Programmstart möchte ich das Fenster zeigen, und danach eines der "inneren" Panels quasi ins Bild rollen lassen. D.h. ich hab ne Schleife die dieses Panel nimmt und Stück für Stück dessen Position ändert.

So, leider malt er mir nicht diesen Vorgang, sondern er malt mir das Ding nur wenn es komplett fertig verschoben ist, was natürlich doof aussieht und nicht der gewünschte Effekt ist.

Mir wurde bisher standardmässig immer zu EventQueue/SwingUtilities geraten, und das hat dann auch oft geklappt, aber diesmal nicht:

in der main:
Code:
MainFrame frame = new MainFrame(data);
		frame.setVisible(true);
		frame.getSidePanel().slideIn();

Das Frame hat n Panel, und in diesem Panel ist wie gesagt das SidePanel. die Methode slideIn() vom SidePanel sieht so aus:

Code:
public void slideIn() {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				int xLoc;
				while((xLoc = getLocation().x) > 500) {
					setLocation(xLoc - 5, getLocation().y);
 // Erklärung der nächsten 2 Zeilen: Ich war mir jetz nich so sicher, was ich überhaupt repainten muss...
 // Das Panel, auf dem dieses Panel liegt, oder dieses Panel selbst? Immerhin mal ich ja nix rum in diesem Panel,
// sondern verschiebe es im Vater-Panel... Zumindest funktionieren beide Varianten (auch einzeln) nicht:
					parent.repaint();
					repaint();
					try {
						Thread.sleep(50);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
	}

Jo.. wie gesagt er repaintet mir nicht während er das macht, sondern erst wenn er fertig ist. Why :cool:
 

André Uhres

Top Contributor
Versuch's mal so:
Code:
public void slideIn() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            int xLoc = getLocation().x;
            while (xLoc > 500) {
                xLoc -= 5;
                setLocation(xLoc, getLocation().y);
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
 

Marco13

Top Contributor
Wobei das dann ja eigentlich wieder so sein müßte:
Code:
public void slideIn() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            int xLoc = getLocation().x;
            while (xLoc > 500) {
                xLoc -= 5;
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        setLocation(xLoc, getLocation().y);
                    }
                });
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
setLocation und getLocation sollten (gerade in dieser Kombination) nur im EDT aufgerufen werden...

EDIT: Hups - das erste getLocation müßte eigentlich auch in den EDT - ggf. dann mit invokeAndWait ???:L Oder so...
 

André Uhres

Top Contributor
Mit javax.swing.Timer wird's garantiert threadsafe:
Code:
public void slideIn() {
    timer = new javax.swing.Timer(50, new ActionListener() {
        private int xLoc;
        public void actionPerformed(ActionEvent e) {
            xLoc = getLocation().x;
            if (xLoc > 500) {
                xLoc -= 5;
                setLocation(xLoc, getLocation().y);
            } else {
                timer.stop();
            }
        }
    });
    timer.start();
}
 

hdi

Top Contributor
cool das mit dem timer kannte ich noch gar nicht... und das is IMMER threadsafe? ich frag nur weil wieso hab ich das noch nie gesehen? Wieso hat das hier noch nie jemand vorgeschlagen...hats auch Nachteile oder sowas?
 

André Uhres

Top Contributor
Die actionPerformed wir naturgemäss auf dem EventDispatchThread ausgeführt,
wo immer nur ein Prozess zur gleichen Zeit laufen kann.
Der Swing Timer ist aber nur für sehr kurze und GUI-bezogene Prozesse gedacht.
Bei langen Prozessen würde die GUI jedesmal für die Länge des Prozesses blockieren.
 

Verjigorm

Top Contributor
André Uhres hat gesagt.:
Die actionPerformed wir naturgemäss auf dem EventDispatchThread ausgeführt,
wo immer nur ein Prozess zur gleichen Zeit laufen kann.

Wo steht das?
Gelesen hab ich das schon nen paar mal, aber noch nie irgendwo offiziell gelesen
 

Verjigorm

Top Contributor
hm werd ich mir mal anschauen,
schade dass sowas nicht in der API steht, sonst steht auch immer ob thread-safe oder nicht ...
 

Marco13

Top Contributor
Verjigorm hat gesagt.:
André Uhres hat gesagt.:
Die actionPerformed wir naturgemäss auf dem EventDispatchThread ausgeführt,
wo immer nur ein Prozess zur gleichen Zeit laufen kann.

Wo steht das?
Gelesen hab ich das schon nen paar mal, aber noch nie irgendwo offiziell gelesen

Auf http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html steht
Note that the Swing timer's task is performed in the event dispatch thread. This means that the task can safely manipulate components, but it also means that the task should execute quickly
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben