Swing JWindow flackert beim resizen

hemeroc

Bekanntes Mitglied
Hi,
ich habe ein kleines performance Problem beim manuellen resizen eines JWindow. Beim resizen des Fensters "flackert" es oder besser gesagt es wird zu langsam neu gezeichnet. Vielleicht fällt jemandem von euch ja eine Lösung ein.

TESTKLASSE

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;


public class TestResizeableWindow {

	public static ResizeableWindow resizeableWindow;
	
	public static void main(String[] args) {
		JPanel jPanel = new JPanel();
		JButton exitButton = new JButton("exit");
		exitButton.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				TestResizeableWindow.resizeableWindow.dispose();
			}
		});
		jPanel.add(exitButton);
		resizeableWindow = new ResizeableWindow(
				BorderFactory.createLineBorder(Color.RED, 5),
				jPanel
			);
		resizeableWindow.setSize(new Dimension(300, 400));
		resizeableWindow.setLocationRelativeTo(null);
		resizeableWindow.setVisible(true);
	}
	
}

RESIZEABLE_WINDOW

Java:
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Arrays;

import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

public class ResizeableWindow extends JWindow {
	
	private static final long serialVersionUID = 1704588697579741996L;

	private boolean _resizeable = true;
	private Border _resizeBorder;
	private JPanel _moveJPanel;
	private final ResizeListener _resizeListener = new ResizeListener (this);
	
	public boolean isResizeable() {
		return this._resizeable;
	}
	
	public void setResizeable(boolean resizeable) {
		this._resizeable = resizeable;
		if (!this._resizeable) {
			this.removeMouseListener(this._resizeListener);
			this.removeMouseMotionListener(this._resizeListener);
			this.setCursor(Cursor.getDefaultCursor());
		} else {
			if (!Arrays.asList(this.getMouseListeners()).contains(this._resizeListener)) {
				this.addMouseListener(this._resizeListener);
			}
			if (!Arrays.asList(this.getMouseMotionListeners()).contains(this._resizeListener)) {
				this.addMouseMotionListener(this._resizeListener);
			}
		}
	}
	
	public ResizeableWindow (Border resizeBorder, JPanel jPanel) {
		this._resizeBorder = resizeBorder;
		this._moveJPanel = jPanel;
		this.rootPane.setBorder(this._resizeBorder);
		this.add(this._moveJPanel);
		this.setResizeable(true);
	}

	private class ResizeListener extends MouseAdapter implements MouseMotionListener {
		
			private static final byte NO_RESIZE = 0;
			private static final byte RESIZE_NORTH = 4;
			private static final byte RESIZE_EAST = 1;
			private static final byte RESIZE_SOUTH = 8;
			private static final byte RESIZE_WEST = 2;
			
			private byte _resizeDirection = ResizeListener.NO_RESIZE;

			private final JWindow _jWindow;
			private Rectangle tempBounds = new Rectangle();
			
			public ResizeListener(JWindow jWindow) {
				this._jWindow = jWindow;
			}
			
			public void mousePressed(MouseEvent mouseEvent) {
				this._resizeDirection = getResizeDirection(mouseEvent);
			}
			
			public void mouseReleased(MouseEvent mouseEvent) {
				this._resizeDirection = ResizeListener.NO_RESIZE;
			}
			
			public void mouseMoved(MouseEvent mouseEvent) {
				short direction = getResizeDirection(mouseEvent);
				this._jWindow.setCursor(getCursorByDirection(direction));
			}
			
			public void mouseDragged(MouseEvent mouseEvent) {
				Rectangle bounds = this._jWindow.getBounds(tempBounds);
				Point mousePosition = mouseEvent.getPoint();
				SwingUtilities.convertPointToScreen(mousePosition, this._jWindow);
				if ((this._resizeDirection & ResizeListener.RESIZE_EAST) != 0) {
					bounds.width = mouseEvent.getX();
				} else if ((this._resizeDirection & ResizeListener.RESIZE_WEST) != 0) {
					bounds.width += bounds.x - mousePosition.x;
					bounds.x = mousePosition.x;
				}
				if ((this._resizeDirection & ResizeListener.RESIZE_SOUTH) != 0) {
					bounds.height = mouseEvent.getY();
				} else if ((this._resizeDirection & ResizeListener.RESIZE_NORTH) != 0) {
					bounds.height += bounds.y - mousePosition.y;
					bounds.y = mousePosition.y;
				}
				if (this._jWindow.getMinimumSize().height > bounds.height) {
					bounds.y = this._jWindow.getBounds().y;
					bounds.height = this._jWindow.getMinimumSize().height;
				}
				if (this._jWindow.getMinimumSize().width > bounds.width) {
					bounds.x = this._jWindow.getBounds().x;
					bounds.width = this._jWindow.getMinimumSize().width;
				}
				this._jWindow.setBounds(bounds);
				this._jWindow.validate();
				this._jWindow.repaint();
			}
			
			private byte getResizeDirection(MouseEvent mouseEvent) {
				byte resizeDirection = ResizeListener.NO_RESIZE;
				Dimension componentDimension = this._jWindow.getSize();
				Point mousePosition = mouseEvent.getPoint();
				Insets insets = this._jWindow.getRootPane().getInsets();
				if (mousePosition.x <= insets.left) {
					resizeDirection |= ResizeListener.RESIZE_WEST;
				} else if (mousePosition.x >= componentDimension.width - insets.right) {
					resizeDirection |= ResizeListener.RESIZE_EAST;
				}
				if (mousePosition.y <= insets.top) {
					resizeDirection |= ResizeListener.RESIZE_NORTH;
				} else if (mousePosition.y >= componentDimension.height - insets.bottom) {
					resizeDirection |= ResizeListener.RESIZE_SOUTH;
				}
				return resizeDirection;
			}
					
			private Cursor getCursorByDirection(int direction) {
				int cursorType = Cursor.DEFAULT_CURSOR;
				switch (direction) {
					case ResizeListener.RESIZE_NORTH:
						cursorType = Cursor.N_RESIZE_CURSOR;
						break;
					case (ResizeListener.RESIZE_NORTH | ResizeListener.RESIZE_EAST):
						cursorType = Cursor.NE_RESIZE_CURSOR;
						break;
					case ResizeListener.RESIZE_EAST:
						cursorType = Cursor.E_RESIZE_CURSOR;
						break;
					case (ResizeListener.RESIZE_SOUTH | ResizeListener.RESIZE_EAST):
						cursorType = Cursor.SE_RESIZE_CURSOR;
						break;
					case ResizeListener.RESIZE_SOUTH:
						cursorType = Cursor.S_RESIZE_CURSOR;
						break;
					case (ResizeListener.RESIZE_SOUTH | ResizeListener.RESIZE_WEST):
						cursorType = Cursor.SW_RESIZE_CURSOR;
						break;
					case ResizeListener.RESIZE_WEST:
						cursorType = Cursor.W_RESIZE_CURSOR;
						break;
					case (ResizeListener.RESIZE_NORTH | ResizeListener.RESIZE_WEST):
						cursorType = Cursor.NW_RESIZE_CURSOR;
						break;
					default:
						cursorType = Cursor.DEFAULT_CURSOR;
						break;
				}
				return Cursor.getPredefinedCursor(cursorType);
			}

	}

}

LG
Hemeroc
 

Onkel Hatti

Bekanntes Mitglied
Hmm.

Meine "Maschine"

Core 2 Quad Q6600 (2,4GHz)
3 GB Ram
GForce 8600 GT
Windows 7 Professional
JDK 1.6_18

Bei mir läuft das absolut flüssig.

Hatti
 

Schandro

Top Contributor
Bei mir läufts absolut flüssig, bis auf das während des resizen ca. alle 3 sekunden für ne millisekunde das Fenster komplett schwarz wird.
Dualcore jeweils 2,4 ghz
4GB Ram
windows 7 64bit
java 1.6
 

hemeroc

Bekanntes Mitglied
Bei mir läufts absolut flüssig, bis auf das während des resizen ca. alle 3 sekunden für ne millisekunde das Fenster komplett schwarz wird.

Ich muss gestehen das stimmt mich nicht gerade optimistischer =(
Auch das sollte nicht passieren eigentlich.

Ich hab das Problem mal schnell auf Video aufgezeichnet, damit ihr seht wie es bei mir aussieht.
(Alles was hier zu sehen ist liegt NICHT an der Videoaufzeichnung das sieht real ganz genauso aus.)
YouTube - flackern.ogv
Ich hoffe, jemanden fällt eine Lösung ein.

LG Hemeroc
 

Onkel Hatti

Bekanntes Mitglied
Vielleicht hängt auch das mit der Grafik(-treiberei) zusammen.
Wenn du Windows Vista oder Windows 7 hast, schalt doch mal Aero aus.

Hatti
 

hemeroc

Bekanntes Mitglied
Ich verwende
  • Ubuntu 9.10 mit der Sun JVM
  • Compiz + Emerald (die Fenster sind aber nicht mit irgendwelchen Effekten verschönert oder so)
Allerdings ist das auch nur ein 2GHz Prozessor; 1GB Ram und eine ATI X700.
LG Hemeroc
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing JWindow flackert trotz Doppelpufferung AWT, Swing, JavaFX & SWT 2
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
V JWindow: Falsche Anzeige auf Ubuntu AWT, Swing, JavaFX & SWT 2
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
H Swing JTextField in JWindow, JWindow bekommt focus zurück? AWT, Swing, JavaFX & SWT 9
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
M Swing Semi-Transparenter Button (normal, mouseover) auf transparentem JWindow AWT, Swing, JavaFX & SWT 44
M Animiertes Gif auf JWindow AWT, Swing, JavaFX & SWT 10
GUI-Programmer Swing JWindow - Programm wird ohne Grund beendet AWT, Swing, JavaFX & SWT 3
GUI-Programmer JWindow zwischen den Desktopbild und Dektopverknüpfungen AWT, Swing, JavaFX & SWT 16
N JOptionPane als JWindow AWT, Swing, JavaFX & SWT 2
G Unterschiedliche Pfadangabe zu Icons zwischen JApplet und JWindow? AWT, Swing, JavaFX & SWT 2
E JWindow bewegen, minimieren, vergrößern und schließen AWT, Swing, JavaFX & SWT 5
M JWindow schließen wenn Frame sich ändert AWT, Swing, JavaFX & SWT 2
D JWindow rund machen AWT, Swing, JavaFX & SWT 11
hdi JWindow's mouseExited methode AWT, Swing, JavaFX & SWT 2
P JFrame/JWindow in der Mitte des Bildschirms positionieren AWT, Swing, JavaFX & SWT 4
R JWindow dockt nicht an JFrame bzw. nicht sichtbar ? AWT, Swing, JavaFX & SWT 6
M JWindow mit Rahmen(border) ausstatten AWT, Swing, JavaFX & SWT 4
C JWindow.setVisible(true) dauert ewig AWT, Swing, JavaFX & SWT 7
G JFrame/JWindow AWT, Swing, JavaFX & SWT 2
H JWindow schließen bei einem Klick außerhalb der Anwendung? AWT, Swing, JavaFX & SWT 19
G JWindow Fensterhirachie beibringen AWT, Swing, JavaFX & SWT 14
R JWindow und JFrame AWT, Swing, JavaFX & SWT 3
S Bild auf JWindow platzieren AWT, Swing, JavaFX & SWT 4
L Probleme mit JTextField im JWindow AWT, Swing, JavaFX & SWT 4
F JWindow mit einem Bild und Transparenz AWT, Swing, JavaFX & SWT 4
L JWindow schliessen AWT, Swing, JavaFX & SWT 4
M jwindow --> jpanel --> jpanel --> textfeld nicht en AWT, Swing, JavaFX & SWT 3
D JWindow => transparent ? AWT, Swing, JavaFX & SWT 2
S JWindow zeichent Bild nicht AWT, Swing, JavaFX & SWT 2
K JWindow zerstören AWT, Swing, JavaFX & SWT 3
B KeyEvents und JWindow AWT, Swing, JavaFX & SWT 6
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
M Warum flackert das Bild ? (Swing) AWT, Swing, JavaFX & SWT 16
frankred Swing Eigener ListCellRenderer D'n'D "MOVE" - Mauszeiger flackert AWT, Swing, JavaFX & SWT 14
T Swing OpenOffice IFrame flackert beim ändern der Größe AWT, Swing, JavaFX & SWT 6
K Swing Spiel flackert sehr häufig AWT, Swing, JavaFX & SWT 2
J Applet Tetris flackert AWT, Swing, JavaFX & SWT 9
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
B Swing JButton flackert trotz DoubleBufferings AWT, Swing, JavaFX & SWT 11
J Swing JEditorPane flackert AWT, Swing, JavaFX & SWT 2
Dragonfire ZoomImage flackert -> Fehler: repaint-Aufruf [gelöst] AWT, Swing, JavaFX & SWT 5
P Image auf JPanel flackert AWT, Swing, JavaFX & SWT 3
M DragAndDrop-Waypoints bewegen, ABER Bildschirm flackert AWT, Swing, JavaFX & SWT 3
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
C JScrollPane flackert AWT, Swing, JavaFX & SWT 10
F JScrollPane ruckelt/flackert AWT, Swing, JavaFX & SWT 5
S [Swing] Tabelle flackert AWT, Swing, JavaFX & SWT 8
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
S Fehler beim Öffnen weiterer FXML AWT, Swing, JavaFX & SWT 11
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
G Gui updated beim zweiten Aufruf nicht mehr AWT, Swing, JavaFX & SWT 15
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
R NullPointerException beim Start des Fensters AWT, Swing, JavaFX & SWT 1
J Kann mir jemand beim MediaPlayer helfen ? AWT, Swing, JavaFX & SWT 2
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
ruutaiokwu Swing windowStateChanged macht exakt das Gegenteil beim Verändern der Fenstergrösse AWT, Swing, JavaFX & SWT 3
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
steven789hjk543 Swing Verstehe etwas beim GUI nicht AWT, Swing, JavaFX & SWT 3
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
A Fehler beim Hintergrund AWT, Swing, JavaFX & SWT 17
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
J Hilfe beim tablevies AWT, Swing, JavaFX & SWT 2
L JavaFX Fehler beim setzen von Farben AWT, Swing, JavaFX & SWT 16
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
L JSplitPane Divider Location beim Maximieren AWT, Swing, JavaFX & SWT 6
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
emma_louisa JavaFX Werte beim Aufrufen des Fensters übernehmen (SceneBuilder) AWT, Swing, JavaFX & SWT 3
Tronert JavaFX Fehler beim Ändern der font-weight AWT, Swing, JavaFX & SWT 7
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D Kein Icon beim JTabbedPane AWT, Swing, JavaFX & SWT 1
L JavaFX LoadException beim Laden von JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben