Swing remove(Component) blockiert Thread sehr lange.

Volvagia

Top Contributor
Hi, ich hoffe ihr könnt mir helfen.
Ich habe einen TimerTask, der ein Panel aus einer Map hohlt, es einem anderen Panel hinzufügt, und einen Thread startet, der ein Panel, was sich zu dem Zeitpunkt über dem hinzugefügten Panel befindet nach links verschiebt, bis es nichtmehr sichtbar ist und es danach entfernt.
Nun habe ich aber das Problem, dass die remove(Component) sehr lange in der Methode Thread.holdsLock(Object) dem momentanen Thread blockiert, und ich keine Ahnung habe woran das liegen könnte. Auch Google hat nichts ausgespuckt. Weiß jemand zufällig, woran das liegen könnte? Auf die 3 Panels wird sonst an keiner Stelle zugegriffen.

Java:
public void enterNextRoom(int x, int y, int floor, final Room newRoom)
{
	stopRoom();

	SwingUtilities.invokeLater(new Runnable() {
		public void run()
		{
			RoomPanel.getInstance().add(newRoom);
		}
	});

	new Thread("Fade Room") {
		public void run()
		{
			double speed = 0.0d;
			double x = getX();
			do
			{
				speed+= 4.0d;
				x-= speed;
				final int finalVar = (int) x;
				
				SwingUtilities.invokeLater(new Runnable() {
					public void run()
					{
						setLocation(finalVar, getY());
					}
				});
				
				try
				{
					TimeUnit.MILLISECONDS.sleep(40L);
				}
				catch (InterruptedException e) {}
			}
			while(x > -640);
			
			SwingUtilities.invokeLater(new Runnable() {
				public void run()
				{
					RoomPanel.getInstance().remove(Room.this);
				}
			});
			
			newRoom.focusPlayer();
		}
	}.start();
}
 
S

SlaterB

Gast
wie lange ist denn 'sehr lange'? wird es weniger wenn die Schleife mit setLocation() wegfällt oder auch schon wenn die Aufrufe verringert werden?
ein vollständiges Testprogramm wäre toll aber zuviel verlangt?
ich habe immerhin testweise selber eins gemacht, da läuft alles recht flott

Java:
public class TestGUI  extends JFrame {
    public TestGUI() {
        setLayout(null);
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        final TestGUI g = new TestGUI();

        Thread.sleep(1000);
        for (int j = 0; j < 5; j++) {
            final int y = j * 30 + 30;
            Thread.sleep(100);
            final JLabel l = new JLabel("test");
            l.setSize(100, 20);
            SwingUtilities.invokeLater(new Runnable()  {
                    public void run() {
                        g.add(l);
                    }
                });

            new Thread("Fade Room") {
                    public void run()    {
                        System.out.println("start");
                        for (int i = 0; i < 10; i++)  {
                            final int x = i * 10 + 30;
                            SwingUtilities.invokeLater(new Runnable()  {
                                    public void run()  {
                                        l.setLocation(x, y);
                                        g.repaint();
                                    }
                                });
                            try {
                                Thread.sleep(60);
                            }
                            catch (Exception e)  {
                                System.exit(0);
                            }
                        }

                        SwingUtilities.invokeLater(new Runnable()     {
                                public void run() {
                                    g.remove(l);
                                    g.repaint();
                                }
                            });
                        System.out.println("end");
                    }
                }.start();
        }
    }
}

ist mit null-Layout, wenn am Ende kein repaint() steht, dann bleibt das letzte JLabel vorerst stehen,
das verwechselst du nicht zufällig mit warten?
 

Volvagia

Top Contributor
In etwa 18 Sekunden. Ohne Schleife dauert es genauso lange. Da der Thread in Thread.holdsLock(Object) festhängt, dachte ich mir, dass ein fremder Thread dem Monitor des Objektes hat. Ich selbst verwende aber nur ReentrantLock. :(
 

Volvagia

Top Contributor
Ich meinte allgemein, gelockt wird eigendlich nur bei Listzugriffen.
Wobei, weiß zufällig jemand, ob remove noch etwas mit den Components macht, die darauf liegen? Auf dem Panel liegt ein anderes mit 462 Comps., und ich dachte, dass er vielleicht zufällig immer in der selben Methode wärend dem pausieren stehen bleibt, weil sie etwas länger als die anderen braucht? Ich habe es jetzt vorrübergehend so umgebaut, dass das Panel einfach links außerhalb des Bildschirms bleibt, aber ich denke, dass das auf Dauer ausbremsen wird, da die Panels sich mit der Zeit vermehren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A remove(Component) funktioniert nicht; JTable AWT, Swing, JavaFX & SWT 4
C Problem mit remove(Component comp) AWT, Swing, JavaFX & SWT 23
K Swing remove(JPanel) funktioniert nicht AWT, Swing, JavaFX & SWT 5
J remove() components bei event von JComboBox AWT, Swing, JavaFX & SWT 2
G Remove Panels von JFrame AWT, Swing, JavaFX & SWT 5
K MenuItem, StyledDocument remove AWT, Swing, JavaFX & SWT 16
N JTable remove row AWT, Swing, JavaFX & SWT 6
P Table Layout remove()? AWT, Swing, JavaFX & SWT 2
S Verschwindende JComboBox (Problem mit Remove?) AWT, Swing, JavaFX & SWT 2
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
C Swing Component bei Doppelklick löschen AWT, Swing, JavaFX & SWT 4
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
M Swing Component Resize AWT, Swing, JavaFX & SWT 7
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
W Swing Component mehrfach adden AWT, Swing, JavaFX & SWT 0
H Drag component out of window AWT, Swing, JavaFX & SWT 1
A Swing Focus auf gemalte Component AWT, Swing, JavaFX & SWT 5
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
Ebenius AWT Bug in Component.getLocationOnScreen() AWT, Swing, JavaFX & SWT 7
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
B JTable Component mit String? AWT, Swing, JavaFX & SWT 4
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
H Component Zerren AWT, Swing, JavaFX & SWT 5
S Swing Component vertikal und hochizontal zentrieren? AWT, Swing, JavaFX & SWT 5
Z Component für File-Browser ähnliche Oberfläche AWT, Swing, JavaFX & SWT 6
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
F AWT Component in OpenGL anzeigen? AWT, Swing, JavaFX & SWT 18
A Java Konsolen Component AWT, Swing, JavaFX & SWT 6
G Swing Component.toString() was bedeutet flags AWT, Swing, JavaFX & SWT 8
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
DamienX Swing Component auf mehreren Containern AWT, Swing, JavaFX & SWT 2
algorismi AWT Tranparente heavyweight component AWT, Swing, JavaFX & SWT 2
R Swing Methode add([Component]) funzt nich AWT, Swing, JavaFX & SWT 7
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
U LayoutManager [GBL] Component aus einer Zelle löschen AWT, Swing, JavaFX & SWT 2
H Swing Illegal component position! AWT, Swing, JavaFX & SWT 2
C Flamingo Component AWT, Swing, JavaFX & SWT 2
M Doppelklick auf Component abfangen AWT, Swing, JavaFX & SWT 5
P DragAndDrop zw Component und Container AWT, Swing, JavaFX & SWT 4
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
R Zugriff auf Component um addComponentListener() aufzurufen AWT, Swing, JavaFX & SWT 4
K AWT/SWING intern - Wie funktioniert die Component-Ermittlung AWT, Swing, JavaFX & SWT 13
S Line Component in SWING AWT, Swing, JavaFX & SWT 2
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
C Syntax Highlighting Component AWT, Swing, JavaFX & SWT 2
O KeyBoardFocusManager - previous und next Component checken? AWT, Swing, JavaFX & SWT 2
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
A erneutes Öffnen jInternalFrame: illegal component position AWT, Swing, JavaFX & SWT 4
0 Component austauschen und aktualisieren ? AWT, Swing, JavaFX & SWT 6
S Thread beenden, wenn Component nicht mehr benötigt wird AWT, Swing, JavaFX & SWT 12
G "Rating Component" - Bewerten über JTable AWT, Swing, JavaFX & SWT 3
G Drag And Drop von Component (List, Tree) zum Desktop AWT, Swing, JavaFX & SWT 2
F LayoutManager und Component.setVisible(boolean) AWT, Swing, JavaFX & SWT 2
P Component ändern (repaint) AWT, Swing, JavaFX & SWT 9
F Probleme bei add(Component) JPanel > JFrame AWT, Swing, JavaFX & SWT 3
B Component AWT, Swing, JavaFX & SWT 5
L Swing Component in Buffered Image AWT, Swing, JavaFX & SWT 6
G Component "finden" AWT, Swing, JavaFX & SWT 6
H Component fokussierbar machen AWT, Swing, JavaFX & SWT 2
P Wie das Component Object des Hauptfensters ermitteln? AWT, Swing, JavaFX & SWT 4
M GridBagLayout - Component Position AWT, Swing, JavaFX & SWT 4
R Component einer Form herausbekommen AWT, Swing, JavaFX & SWT 3
T JMenu/JMenuItem Component auf der geaddet wurde AWT, Swing, JavaFX & SWT 16
B Component in JSplitPane aktualisieren AWT, Swing, JavaFX & SWT 2
G add(Component) in paintComponent erlaubt ? AWT, Swing, JavaFX & SWT 2
K Component einfügen in JPane AWT, Swing, JavaFX & SWT 5
M getSize von Component und ModelListener AWT, Swing, JavaFX & SWT 2
S Component auf Label zeichnen? AWT, Swing, JavaFX & SWT 3
R convertPointToScreen(Point p, Component c) AWT, Swing, JavaFX & SWT 5
R Component aus Container entfernen bzw. austauschen. AWT, Swing, JavaFX & SWT 6
C JPanel Component austauschen AWT, Swing, JavaFX & SWT 4
J Swing JMenuItem blockiert JMenuBar AWT, Swing, JavaFX & SWT 2
T SWT Fortschritt, GUI blockiert Abarbeitung AWT, Swing, JavaFX & SWT 0
P Swing GUI noch nicht gezeichnet - Logik läuft - blockiert AWT, Swing, JavaFX & SWT 3
P Event Handling Gedrückte Maus Blockiert MausEvents AWT, Swing, JavaFX & SWT 2
H Gui blockiert AWT, Swing, JavaFX & SWT 8
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
J Gui blockiert / friert ein AWT, Swing, JavaFX & SWT 30
R SWT Statusmeldung im neuen Fenster blockiert aufrufendes Fenster AWT, Swing, JavaFX & SWT 2
J Scheinbar blockiert Swing bei JTree, was mach ich falsch? AWT, Swing, JavaFX & SWT 7
S Listener übergeordneter Componente Blockiert AWT, Swing, JavaFX & SWT 6
C Schweres Problem mit JDialog und Threads! Anzeige blockiert! AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben