Buttons sehen immer "active" aus

Vokabulator

Mitglied
Hallo!

Ich hab nen JFrame, in dem ich ein JPanel habe, auf dem ein paar Buttons positioniert sind (also jpanel.add(button), jframe.add(panel))

Wenn ich das Ganze starte, sehen die buttons korrekt aus. Wenn ich dann aber einen der Buttons klicke, der einen JFileChooser öffnet und dann den FileChooser schließe oder auf OK drücke, dann sieht dieser Button so aus, als würde ich die ganze Zeit mit der Maus drauf drücken, als wäre er gerade aktiv - ich bin aber mit der Maus nicht drauf. Und wenn ich dann mit der Maus über die anderen Buttons fahre, sehen die danach auch so aus.

Hat jemand schon ne Idee, was das sein könnte?

So hab ich das mit dem chooser gemacht:

Java:
	protected static void openStylesheetChooser() {
		setUIManager();

		filter = new FileNameExtensionFilter("XSL-Dateien", "xsl");
		chooser1 = new JFileChooser();
		chooser1.setMultiSelectionEnabled(true);
		chooser1.addChoosableFileFilter(filter);
		chooser1.showOpenDialog(null);
		if (chooser1.getSelectedFile() != null)
			infoarea.append("Stylesheet ausgewählt\n");
	}

und die gui starte ich so:

Java:
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Thread() {
			public void run() {
				Layout test = new Layout();
				test.GUI();
			}
		});
	}
 
Bin mir jetzt nicht sicher, aber ist der Dialog nicht einfach Modal? Behalten die Buttons den Zustand, auch nachdem der Chooser geschlossen wurde, oder einfach nur, wenn du den Chooser zu Seite schiebst?
 
Hallo!

Ich verstehe nicht genau, was du mit modal und "zur Seite schieben" meinst. Wen ich auf den Button klicke, dann öffnet sich der chooser.Und egal, ob ich eine Datei auswähöe und auf OK klicke oder auf abbrechen klicke, die buttons sehen nachher so aus. während der chooser offen ist, passiert nix.
 
Lässt sich schwer sagen. Wird der Button denn die ganze Zeit als "gedrückt" dargestellt sobald der FileChooser aufgeht? Denn normalerweise müsste der Button nur so lange als gedrückt gezeichnet werden wie die Maustaste gedrückt wird.

d.h.
Maustaste drücken (und gedrückt lassen) --> Button wird als gedrückt gezeichnet.
Maustaste loslassen --> Button wird als nicht gedrückt gezeichnet --> ActionListener führen ihre Aktionen aus (zB FileChooser öffnen)
 
Zuletzt bearbeitet:
Ja genau, so sollte es sein: Während des Drückens ist der button grau und wenn ich loslasse, sollte er wieder blau sein. Das klappt nur, solange ich noch keinen filechooser geöffnet habe, alslo direkt nach dem Starten der Applikation.
Sobald ich auf einen button klicke, der einen filechooser öffnet und den chooser danach wieder schließe, bleibt der gedrückte Button permanent grau und alle anderen buttons werden grau sobald ich mit der Maus drüberfahre. Danach bleiben sie die ganze Zeit grau. Auch dann, wenn ich den chooser-Dialog noch mal öffne.
 
Ich vermute mal, dass "Sobald ich auf einen button klicke, der einen filechooser öffnet" gleichbedeutend ist mit "sobald die Methode openStylesheetChooser() aufgerufen wird". Das geht zwar aus den bisherigen Beiträgen nicht hervor, erscheint mir aber wahrscheinlich.
Die genannte methode sieht unverdächtig aus, bis auf den Aufruf von "setUIManager()". Was passiert da?
Warum das alles statische Methoden sein müssen, müsste man auch mal klären.
Hast du ein vollständiges, kompilierbares und lauffähiges Beispiel?
 
Hallo Harry Kane, du hast es erfasst, es lag an der setUIManager-Methode 🙂

Java:
private void setUIManager() {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException | InstantiationException
				| IllegalAccessException | UnsupportedLookAndFeelException e) {
			infoarea.append("Problem mit UIManager, siehe log");
			e.printStackTrace();
		}
	}

Wo ist da das Problem?

und static mussten die Methoden gar nicht mehr sein. Ich hatte das am Anfang mal so, aber mittlerweile gehts auch ohne. Sind jetzt also nicht mehr static.

Da wird gerade dabei sind (auch wenns leicht vom Thema abweicht): Wann macht es denn Sinn, static zu benutzen? Dann, wenn ich kein Objekt brauche oder gibts da ne bessere "Regel"? Ich hab noch zwei Klassen, in denen ich nur eine Transformation von XML in PDF vornehme, die haben also nur eine Methode. Diese Methoden habe ich static gemacht. Oder sollte ich da besser ein Objekt erzeugen?
 

Zurück
Oben