JButton ausblenden

Hi,

habe ein Probem mit meiner GUI. Auf meinem Panel liegt ein JButton (Start). Sobald dieser gedrückt wird soll der Start-Button verschwinden und eine Funktion gestartet werden. Jetzt ist das Problem das wenn ich auf den Button klicke, die Funktion gestartet wird aber der Button erst verschwindet sobald die Funktion abgelaufen ist. Den Button lass ich bisher mit

Java:
.setVisible(false);

ausblende.

Muss ich da irgendwie schon mit einem Timer o.a. arbeiten? Oder kann ich das Problem auch anders lösen?
 

jgh

Top Contributor
Hast du in der actionPerf. -Methode diese Reihenfolge auch, also zuerst button..setVisible(false) und dann die andere Aktion?
Falls ja, evtl. noch ein validate() auf das Panel...
 
Also der Abschnitt sieht so aus (Ich poste den einmal rein da es eh nicht so viel ist)

Java:
else if (e.getSource().equals(mw.getStart())) {
// mw = MainWin (meine Fensterklasse)
// getStart returned einfach nur JButton (den Start Button)

			mw.getStart().setVisible(false);
			// Hier hab ich auch mw.validate() und mw.repaint getestet, leider ohne erfolg
                        // mw.getStart().validate() bzw. repaint() hat auch so keinen erfolg.


			iv.playNewIntervall();
			
		}

EDIT: Habs auch mit mw.getUp().validate() bzw. repaint() versucht hat aber leider auch nciht geklappt.
getUp liefert mir mein JPanel zurück auf dem der Button liegt.
 
Zuletzt bearbeitet:

jgh

Top Contributor
keine Ahnung warum...aber folgendes Testprogramm macht genau das, da hilft es imho nur dein Problemm auf ein KSKB runterzubrechen und dann kann ich zumindest versuchen dir zu helfen...

Java:
public static void main(String[] args) {
		final JFrame f1 = new JFrame();
		f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f1.setSize(500, 500);
		final JButton b = new JButton("Test");
		b.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				b.setVisible(false);
//				f1.validate();
				try {
					Desktop.getDesktop().mail();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		f1.add(b);
		f1.setLocationRelativeTo(null);
		f1.setVisible(true);
	}
 
Hab mal alles raus geholt was unwichtig ist für das Beispiel (heisst es gibt jetzt eigentlich nur noch den frame und den Button. Hab die Klassen Struktur aber mal so abgebildet wie ich es imer mache. Hoffe das ist minimalistisch genug:

Main.java:

Java:
public class Main {
	public static void main (String[] args) {
		MainWinCon mwc = new MainWinCon();
	}
}

[/Java]

MainWindow.java
[code=Java]
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainWindow extends JFrame {

	private MainWinCon mwc;
	
	// Inhalte des Fensters etc
	// Buttons
	JButton bStart;
	
	// Panels
	JPanel pUp, pDown;
	
	public MainWindow(MainWinCon mwc) {
		this.mwc = mwc;
		createWindow();
	}
	
	public void createWindow () {
		setSize(700, 400);
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		pUp = new JPanel();
		pUp.setLayout(null);
		pUp.setBackground(Color.WHITE);
		
		pDown = new JPanel(new GridLayout(2,4));
		pDown.setBackground(Color.WHITE);
		
		
		pUp.setBounds(0, 0, 700, 293);
        pDown.setBounds(0, 294, 700, 70);

        this.add(pUp);
        this.add(pDown);

        bStart = new JButton("Start");
        bStart.setBounds(290, 260, 120, 25);
        bStart.setVisible(true);
        bStart.addActionListener(mwc);
        pUp.add(bStart);
		
		setVisible(true);
		
	}
	
	public JPanel getUp() {
		return this.pUp;
	}
	
	public JButton getStart() {
		return this.bStart;
	}
	
}

MainWinCon.java
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Synthesizer;

public class MainWinCon implements ActionListener {
	
	
	private MainWindow mw;
	private Synthesizer synth;
	private Receiver rcvr;
	
	
	public MainWinCon() {
		mw = new MainWindow(this);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource().equals(mw.getStart())) {
			
			// Button Ausblenden
			mw.getStart().setVisible(false);
			
			mw.invalidate();
			
			// Ton spielen (bzw normalerweise Funktionsaufruf um ein Intervall zu spielen
			try {
				synth = MidiSystem.getSynthesizer();
			} catch (MidiUnavailableException e2) {
				e2.printStackTrace();
			}
			
			try {
				synth.open();
			} catch (MidiUnavailableException e2) {
				e2.printStackTrace();
			}
			
			try {
				rcvr = synth.getReceiver();
			} catch (MidiUnavailableException e1) {
				e1.printStackTrace();
			}
			ShortMessage msg = new ShortMessage();
			try {
				msg.setMessage(ShortMessage.NOTE_ON, 0, 40, 100);
			} catch (InvalidMidiDataException ex) {
				ex.printStackTrace();
			}
			rcvr.send(msg, -1);
			
			try {
				Thread.sleep(1500);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
			
			try {
				msg.setMessage(ShortMessage.NOTE_OFF, 0, 40, 100);
			} catch (InvalidMidiDataException ex) {
				ex.printStackTrace();
			}
			
			rcvr.send(msg, -1);
			synth.close();
			
		}
		else {
			System.out.println("Ein Fehler ist aufgetreten");
		}
	}
}

Das ist jetzt so das kleinste was möglich ist um es mit der Funktion zu testen. Der Button bleibt solange auf dem Panel bis der Ton zuende gespielt wurde und verschwindet erst dann. Obwohl ich die Reihenfolge beachtet habe (erst Button ausblenden, dann den Ton spielen) und selbst mit .validate() funktioniert es nicht. Wenn ich den Ton nicht abspielen lasse, verschwindet auch direkt der Button. Aber der Ton MUSS dort abgespielt werden da es ja schließlich der Start Button ist. Weiss echt nicht weiter.
 
S

SlaterB

Gast
wieso sparst du dir die jetzigen Informationen vorher?
falls du sie erst durch das Verkürzen des Programms gewonnen hast, dann war das ja erfolgreich,

mit diesen Informationen
> Wenn ich den Ton nicht abspielen lasse, verschwindet auch direkt der Button.
usw. ist der Code fast nicht mehr erforderlich,

es gilt: die GUI, der AWT Event-Thread, kann erst dann wieder handeln, z.B. neuzeichnen, wenn der Listener zu Ende bearbeitet ist,
langläufige Aktionen gehörten in einen nebenläufigen Thread, dann dürfte es gehen,

Thread bekannt oder selber herauszufinden? ich spare mir zunächst weiteres ;)
 

jgh

Top Contributor
ok das wusste ich nicht, dass der Listener erst abgearbeitet wird, hier mal qnd ein Thread reingewurschtelt UND unter KSKB versteht man das folgende Prog, fürs nächste Mal ;)

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

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Synthesizer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class KlassenName {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MainWinCon mwc = new MainWinCon();
	}
}

class MainWindow extends JFrame {

	private MainWinCon mwc;

	// Inhalte des Fensters etc
	// Buttons
	JButton bStart;

	// Panels
	JPanel pUp, pDown;

	public MainWindow(MainWinCon mwc) {
		this.mwc = mwc;
		createWindow();
	}

	public void createWindow() {
		setSize(700, 400);
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		pUp = new JPanel();
		pUp.setLayout(null);
		pUp.setBackground(Color.WHITE);

		pDown = new JPanel(new GridLayout(2, 4));
		pDown.setBackground(Color.WHITE);

		pUp.setBounds(0, 0, 700, 293);
		pDown.setBounds(0, 294, 700, 70);

		this.add(pUp);
		this.add(pDown);

		bStart = new JButton("Start");
		bStart.setBounds(290, 260, 120, 25);
		bStart.setVisible(true);
		bStart.addActionListener(mwc);
		pUp.add(bStart);

		setVisible(true);

	}

	public JPanel getUp() {
		return this.pUp;
	}

	public JButton getStart() {
		return this.bStart;
	}

}

class MainWinCon implements ActionListener {

	private MainWindow mw;
	private Synthesizer synth;
	private Receiver rcvr;

	public MainWinCon() {
		mw = new MainWindow(this);

	}

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource().equals(mw.getStart())) {

			// Button Ausblenden
			mw.getStart().setVisible(false);
			

			// Ton spielen (bzw normalerweise Funktionsaufruf um ein Intervall
			// zu spielen
			new Thread(new Runnable() {

				@Override
				public void run() {
					try {
						synth = MidiSystem.getSynthesizer();
					} catch (MidiUnavailableException e2) {
						e2.printStackTrace();
					}

					try {
						synth.open();
					} catch (MidiUnavailableException e2) {
						e2.printStackTrace();
					}

					try {
						rcvr = synth.getReceiver();
					} catch (MidiUnavailableException e1) {
						e1.printStackTrace();
					}
					ShortMessage msg = new ShortMessage();
					try {
						msg.setMessage(ShortMessage.NOTE_ON, 0, 40, 100);
					} catch (InvalidMidiDataException ex) {
						ex.printStackTrace();
					}
					rcvr.send(msg, -1);

					try {
						Thread.sleep(1500);
					} catch (InterruptedException ex) {
						ex.printStackTrace();
					}

					try {
						msg.setMessage(ShortMessage.NOTE_OFF, 0, 40, 100);
					} catch (InvalidMidiDataException ex) {
						ex.printStackTrace();
					}

					rcvr.send(msg, -1);
					synth.close();

				}
			}).start();
		} else {
			System.out.println("Ein Fehler ist aufgetreten");
		}
	}
}
 
Danke funktioniert!

Werde jetzt nur noch versuchen den Thread direkt in die Intervall-Klasse zu implementieren. Damit man sich im späterem Verlauf keine Gedanken mehr darüber machen muss wenn man zB die Methode playIntervall aufrufen will.

es gilt: die GUI, der AWT Event-Thread, kann erst dann wieder handeln, z.B. neuzeichnen, wenn der Listener zu Ende bearbeitet ist..

Das wusste ich leider nicht. Werds mir aber gut merken für die Zukunft ^^
 
mit diesen Informationen
> Wenn ich den Ton nicht abspielen lasse, verschwindet auch direkt der Button.
usw. ist der Code fast nicht mehr erforderlich,

Hatte ich aber doch im ersten Post erwähnt:

Jetzt ist das Problem das wenn ich auf den Button klicke, die Funktion gestartet wird aber der Button erst verschwindet sobald die Funktion abgelaufen ist. Den Button lass ich bisher mit
 
S

SlaterB

Gast
und ich dass ich nicht alles nachlese ;)

super, wieder letztes Wort (edit: Mist, nicht mehr)
 
Zuletzt bearbeitet von einem Moderator:
Ich muss unbedingt aufmerksamer Lesen :oops:

EDIT: :lol: Das mit dem letzten Wort erst nach meinem Post gelesen xD Naja vllt. fällt dir ja noch was ein was du schreiben kannst xD

Ansonsten nochmal Danke an alle die an der Lösung beteiligt waren :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
B JButton Rahmen ausblenden AWT, Swing, JavaFX & SWT 3
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6
J JButton Label ausblenden AWT, Swing, JavaFX & SWT 4
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben