Swing Neuberechnung meiner SwingComponents

qexxler

Aktives Mitglied
Schönen guten Abend zusammen,

Kurzbeschreibung meines Problems (vereifachte Darstellung):

Ich habe einen Frame, der nur einen JButton beinhaltet. Sofern dieser geklickt wird, sollte sich ein weiterer JButton in das Frame setzen. Um die Neuberechnung anzustoßen, habe ich Methode
Java:
 validate()
auf meiner ContentPane aufgerufen (Siehe Quellcode). Nun fällt mir auf, dass wenn ich das Frame größer ziehe, und anschließend den JButton klicke, der neuhinzugefügt JButton flackert.

Nun meine Frage: Wo liegt genau mein Fehler? Meine Vermutung war, dass ich eine falsche Methode zur Neuberechnung aufgerufen habe. Dies hat allerdings keinen Unterschied bei der Implementierung der anderen Methoden (validate(), invalidate() und revalidate() ) gemacht.

Java:
/* IMPORT: */
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ZeichenApp {

	private final JFrame frame;
	private final String TITLE = "Draw Application";
	private Container con;


	private JButton btnAdd;
	private JButton btnInfo;
	private boolean painted = false;

	
	public ZeichenApp() {

		frame = new JFrame();
		frame.setTitle(TITLE);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		createWidgets();
		addWidgets();
		setup();
		
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	private void createWidgets() {
		
		con = frame.getContentPane();
		con.setLayout(new BorderLayout(5, 5));
		btnAdd = new JButton("Add note");
		btnInfo = new JButton("Information");

	}

	private void addWidgets() {
		con.add(btnAdd, BorderLayout.CENTER);
	}

	private void setup() {
		btnAdd.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (!painted) {
					con.add(btnInfo, BorderLayout.PAGE_END);
					con.validate();
					painted = true;
				}
			}
		});
	}

}

Über jeden Tipp in die richtige Richtung bin ich sehr dankbar.

Gruß
 

qexxler

Aktives Mitglied
Ich habe nun erst herumgespielt und festgestellt, dass das Problem mit dem Flackern nicht ist, wenn ich den JButton nicht
Java:
 con.add(btnInfo, BorderLayout.PAGE_END);
sondern hier
Java:
 con.add(btnInfo, BorderLayout.LINE_START);
adde.

Hat dafür jemand eine Erklärung?
 

X5-599

Top Contributor
Also wenn ich deinen ersten Code so ausführe und das Fenster grösser ziehe finde ich dass sich der erste einzige Button genauso neu zeichnet wie wenn beide Buttons sichtbar sind... Vielleicht liegt es am PAGE_END. Kann ich nicht genau sagen.
 

qexxler

Aktives Mitglied
Ich nehme es auch an, dass es irgendwie mit dem PAGE_END zusammenhängt, sicher bin ich mir nicht. Und bevor ich mir aufgrund meiner Spekulation etwas merke, möchte es lieber von erfahrenen Programmierern hier erklärt haben, die wissen, was genau passiert.

Des bei mir flackert eben der zweite Button, wenn ich das Fenster groß ziehe und auf den ersten Button klicke. Finde ich auch komisch.
 

X5-599

Top Contributor
Bin ich überfragt. Ich sehe keinen Unterschied beim Fenstergrösser ziehen. Es scheint so als wenn immer der Button der sich am PAGE_END befindet "etwas" flackert. Wenn nur der erste zusehen ist flackert halt der ein bischen. Wenn dann der zweite dazukommt; dann flackert nur der etwas.

Kann natürlich auch nur mein Eindruck sein. Kenne mich zudem mit den Internals von Swing nicht so aus...
 

Ähnliche Java Themen

Neue Themen


Oben