Repaint Probleme bei Swing (JScrollPane größe ändern)

Status
Nicht offen für weitere Antworten.

Stefan1200

Top Contributor
Ich habe ein repaint Problem.
Sobald ich nach einem Resize der JFrame Componente zwei JScrollPane (Mit JList) in der breite verändern möchte, wird die aktuelle Änderung aber nicht gezeichnet.

Ich habe bereits versucht sämtliche Componenten per repaint() und validate() neuzuzeichen, geht aber nicht, es passiert nichts. Auch e.getComponent().repaint() habe ich versucht, kein unterschied.
So sieht meine componentResized Methode aus:

Code:
	public void componentResized(ComponentEvent e)
	{
		Dimension checkSize = new Dimension(this.getSize());

		int width = ((int)checkSize.getWidth() - 30) / 2;

		dbScroller.setPreferredSize(new Dimension(width,330));
		userScroller.setPreferredSize(new Dimension(width,330));
	}


Biiiitte helft mir...
 

gustav

Aktives Mitglied
Wird die Methode componentResized(..) überhaupt erreicht. Vielleicht hast Du an der falschen Stelle bzw. beim falschen Objekt den Listener ( this.addComponentListener(this); ) registriert ?

:)
 

Stefan1200

Top Contributor
Doch, das funktioniert alles. Nach dem ich das Fenster ein zweites Mal resize, werden mir die Größen der JScrollPane so angezeigt, wie nach dem ersten Resize. Also es scheint definitiv ein repaint problem zu sein. Aber ich bekomme das nicht hin, weder mit repaint, noch mit validate, habe ich an sämtlichen Componenten ausprobiert.
 

gustav

Aktives Mitglied
Glaube mich erinnern zu können schon mal ähnliche Probleme gehabt zu haben. Weiss momentan aber leider nicht mehr wo und wie.

Hilft eventuell eine der 3 Methoden
Code:
  updateUI();   // updates the look and feel !!!
  revalidate();   
  doLayout() ;
Die sollten zumindest in JScrollPane vorhanden sein....
 

schalentier

Gesperrter Benutzer
solche probleme sind häufig und die meisten versuchen dann mit wüsten methoden aufrufen das irgendwie hinzubiegen. irgendwann klappt es dann und man versucht nicht mehr drüber nachzudenken, wieso nun eigentlich.

deswegen sind swing guis so lahm...

also normalerweise sollte man keine der genannten methoden direkt aufrufen, außer man weiß wirklich, warum und wozu die da sind, denn änderungen wie größe/inhalt/etc von swing componenten versuchen normalerweise automatisch ein redraw.

in deinem fall solltest du anstatt
Code:
setPreferredSize(...)
es mit
Code:
setSize(...) oder
setDimension(...)
probieren.

Die PreferredSize ist nämlich die Größe, die der LayoutManager versucht zu setzen, wenn er ein doLayout durchführt. Das bedeutet aber, dass es nicht unbedingt die tatsächliche Größe am Ende sein wird, sondern es sich eben nur um einen Vorschlag handelt.
Mit Size oder Dimension (bin mir grad nich sicher, wie die genau hieß) stellst du die tatsächliche Größe einer componente ein. Allerdings können auch hier Probleme mit dem zugrunde liegenden LayoutManager auftreten.

Probiers mal aus und sag bescheid.

schalentier
 

Stefan1200

Top Contributor
schalentier hat gesagt.:
in deinem fall solltest du anstatt
Code:
setPreferredSize(...)
es mit
Code:
setSize(...) oder
setDimension(...)
probieren.

Probiers mal aus und sag bescheid.

Naja, ich habe auch nie behauptet, das ich ein Profie bin, deshalb frage ich ja ;-)

Schade nur, wenn ich setSize mache (setDimension gibt es nicht), macht er leider gar nichts. Die Größe wird bei mir nur mit setPreferredSize geändert.

Ich habe aber herausgefunden, wie es funktioniert.
Wenn ich direkt nach dem setzen von setPreferredSize folgendes mache:
SwingUtilities.updateComponentTreeUI(this);
dann haut es wunderbar hin.

Ich weiss nicht, ob es die beste Lösung ist, aber Sie funktioniert auf jedenfall.
Wenn es aber noch eleganter geht, immer her mit den Vorschlägen.
 

peppi

Mitglied
Hi,

ich hatte ein ähnliches Problem und bekam in den Foren 2 Möglichkeiten zur Lösung:

1. Threats
Zwei Threats anlegen, damit Resourcen zum Repaint() frei bleiben.


2. Update Graphic (habs so umgesetzt)

Code:
		this.update(this.getGraphics());
--> Einfügen in die Frame-Class z.B. als ChangeEvent o.ä.

Mit diesem einfachen Befehl wird das Frame updated.

Hoffe ich konnte dir helfen.
 

Ebenius

Top Contributor
... und wenn ihr das noch ein kleines bisschen weiter treibt, dann baut ihr nach dem resize die graphik-karte aus und wieder ein und updated dann die treiber auch noch.

@Stefan1200 Schick mir mal ein bisschen mehr source (oder poste's einfach) dann such ich nen sauberen weg, okay?

Grüße, Ebenius
 

Stefan1200

Top Contributor
Ebenius hat gesagt.:
... und wenn ihr das noch ein kleines bisschen weiter treibt, dann baut ihr nach dem resize die graphik-karte aus und wieder ein und updated dann die treiber auch noch.

@Stefan1200 Schick mir mal ein bisschen mehr source (oder poste's einfach) dann such ich nen sauberen weg, okay?

Naja, die Grafikkarte kann drinn bleiben ;-)
Hier mal ein paar Codeschnipsel, die was damit zu tun haben:

Code:
	public void componentResized(ComponentEvent e)
	{
		Dimension checkSize = new Dimension(this.getSize());

		int width = ((int)checkSize.getWidth() - 30) / 2;
		int height = (int)checkSize.getHeight() - 150;

		if (((int)checkSize.getWidth() < 640) || ((int)checkSize.getHeight() < 400))
		{
			this.setSize(640,400);
			width = (640 - 30) / 2;
			height = 400 - 150;
		}

		dbScroller.setPreferredSize(new Dimension(width,height));
		userScroller.setPreferredSize(new Dimension(width,height-30));

		if (this.isVisible())
		{
			SwingUtilities.updateComponentTreeUI(this);
		}
	}

Code:
	JList dbList = new JList();
	JList userList = new JList();

Der darunter liegende Layoutmanager ist BorderLayout.
 

Ebenius

Top Contributor
Laut Deinem Code-Schnipsel setzt Du die Größen der ScrollPanes so, dass diese größer als der umliegende Container sind und damit abgeschnitten werden, wenn der darumliegende Container kleiner als 640x400 pixel groß ist. Das kannst Du unmöglich wollen, zumal Du nicht mal die Positionen änderst.

Wenn ich mal rate, dann willst Du zwei JScrollPanes auf einem Panel (gleichgroß, nebeneinander, das Panel ausfüllend bis auf dreißig pixel abstand) haben und deren Inhalt soll mindestens 305x400px (resp. auch andere Werte) groß sein; oder größer, wenn es das Panel zulässt. Richtig? Das wäre einfach.

Oder willst Du, dass die JScrollPanes selbst Ihre Größe auch verändern? Falls ja, beschreib mal wie (mit Worten). Aber auch das ist nur unwesentlich schwieriger.

Beides lässt sich ohne EventListener ganz sauber und ohne Seiteneffekte lösen!

Bisher hab ich aber leider noch nicht kappiert, was genau Du machen willst (das geht leider aus Deinem Beispiel nicht hervor).

Grüße, Ebenius
 

Voltax

Mitglied
Hallo,

hast Du schon probiert "invalidate" (auf eine der Components die innerhalb der Scrollpanes liegen) aufzurufen, bevor Du "validate" (auf die am weitesten außen liegende Componente) machst ?

Grüße Voltax
 

Stefan1200

Top Contributor
Also, ich habe zwei JScrollPane (die beide eine JList beinhalten), beide haben die selbe größe, sollen nebeneinanderlegen und sollen nur einen 30 pixel spalt haben.

Ich möchte folgendes:
Falls der User das Fenster resized, sollen sich die JScrollPanes in der breite entsprechend anpassen, das es weiterhin nur 30 pixel abstand zwischen beiden sind. In der Höhe werden die JScrollPanes ja automatisch durch das BorderLayout vom darunter liegenden JPanel angepasst.
Der User soll aber das Fenster nicht kleiner resizen können, als 640x400.
Wenn er das macht, wird 640x400 als größe eingestellt.

Vielleicht ist diese Erklärung besser.
 

Ebenius

Top Contributor
... dass Du so was einfaches willst. Getested mit JDK 1.4.1_02 auf Windows 2000.


Zur Nutzung freigegeben (man beachte das todo):
Code:
import java.awt.AWTEvent;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;

/**
 * JFrame with minimum size.
 * 
 * @author [email="ebenius@ebenius.com"]Ebenius[/email]
 * @version 1.0 / 20.11.2003
 */
public class JExtendedFrame extends JFrame
{
	/**
	 * Creates a new JExtendedFrame.
	 */
	public JExtendedFrame()
	{
		enableEvents(AWTEvent.COMPONENT_EVENT_MASK);
	}

	/**
	 * Updating size to minimum of 600 x 400 and calling overridden super 
	 * method.
	 * 
	 * @param e The component event
	 * @see java.awt.Component#processComponentEvent(java.awt.event.ComponentEvent)
	 * 
	 * @todo Implement bound properties for minimum width and height
	 */
	protected void processComponentEvent(ComponentEvent e)
	{
		synchronized (getTreeLock())
		{
			int width, height;
			if ((width = getWidth()) < 600 | (height = getHeight()) < 400)
				setSize(Math.max(600, width), Math.max(400, height));
		}

		super.processComponentEvent(e);
	}

	/**
	 * Test main method
	 */
	public static void main(String[] args)
	{
		JExtendedFrame f = new JExtendedFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(100, 100);
		f.show();
	}
}

Und das ohne Listeners, ohne revalidates, repaints, updateUIs und Graphikkartentreibertausch :shock:

Grüße, Ebenius
 
G

Guest

Gast
Ich habe aber herausgefunden, wie es funktioniert.
Wenn ich direkt nach dem setzen von setPreferredSize folgendes mache:
SwingUtilities.updateComponentTreeUI(this);
dann haut es wunderbar hin.

Tausend Dank! Diese Zeile hat mich nach einer frustrierenden Arbeit von zwei Stunden auf den richtigen Weg gebracht... Gruß
 

Marco13

Top Contributor
Vielleicht auf einen Weg, der dich zu deinem Ziel führt - aber der richtige Weg ist das sicher nicht :noe:
(Sofern du nicht das L&F umstellst/umstellen willst) Diese Methode ist NICHT für Layout-Geschichten gedacht!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E repaint Probleme AWT, Swing, JavaFX & SWT 13
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
W Probleme mit repaint() AWT, Swing, JavaFX & SWT 8
D Repaint Probleme AWT, Swing, JavaFX & SWT 4
F Probleme mit repaint AWT, Swing, JavaFX & SWT 4
I Probleme mit repaint() AWT, Swing, JavaFX & SWT 4
X Probleme mit aktualisierung durch Repaint() Methode AWT, Swing, JavaFX & SWT 3
R Fenster Repaint Probleme AWT, Swing, JavaFX & SWT 7
H JFrame repaint/validate Probleme AWT, Swing, JavaFX & SWT 14
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
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
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
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
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
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
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
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

Ähnliche Java Themen

Neue Themen


Oben