Java Button nach Klick entfernen

2 Antworten

So wie Du Elemente ERZEUGST, kannst Du sie auch WEGWERFEN. Also: Richtig LÖSCHEN.

Du mußt dazu nur alle Bezüge eines Elements aus Deinem Programm löschen (alle Verweise auf das betreffende Element null setzen oder durch etwas anderes ersetzen), weil Java nun mal kein explizites "delete" kennt.

Im GUI wirst Du aber wahrscheinlich eine explizitere Form des Verschwindenlassens haben wollen. Dazu machst Du das Element "invisible" - genau entgegengesetzt zu dem, was Du zu Beginn mit dem gesamten GUI machst (da schnappst Du Dir das höchste Element der Hierarchie und machst ein "setVisible" da drauf, womit alle Elemente der Hierarchie visible gesetzt werden).

In diesem Fall willst Du NUR den Button invisible setzen. Ob Du anschließend das Fenster repainten lassen mußt oder dieses bereits im setvisible eingebaut ist, mußt Du mal probieren!

Dein Button "kennt" solange sein übergeordnetes Fenster, wie er dort als Element eingesetzt ist. Du hattest ihn mit "add" hinzugefügt. Nachdem Du ihn invisible gemacht hast, kannst Du ihn auch einfach aus dem Fenster verschwinden lassen.

Wie immer gibt es eine Vielzahl von Variationsmöglichkeiten für die ganz konkreten Wege, die nach Rom führen...


MrSummer 
Fragesteller
 29.06.2013, 11:57

class buttonListener implements ActionListener

  {
        public void actionPerformed(ActionEvent event)
        {
           button.setBounds(0,0,0,0);
           fenster.remove(button);
        }
    }

So funktioniert es. Jedoch wird nun nur der Befehl button.setBounds(0,0,0,0) ausgeführt. Wenn ich noch einen anderen Befehl gebe, wie zum Beispiel ein Label anzeigen, funktioniert es nicht.

0
WhiteGandalf  29.06.2013, 18:04
@MrSummer

Schönes Beispiel für "viele Wege nach Rom".

Wir könnten ja mal einen Wettbewerb veranstalten, wieviele verschiedene Arten des Unsichtbarmachens uns einfallen...

  • setVisible(false) hatten wir (unsichtbar im eigentlichen Sinn)
  • setBounds(0,0,0,0) hatten wir (unsichtbar durch Verkleinern bis auf nichts)
  • Ein setzen von Hintergrund- und Vordergrundfarbe identisch zum drunterliegenden Hintergrund könnte unter gewissen Bedingungen einen ähnlichen Effekt erzielen.
  • Den Button - wie in CSS üblich - einfach mal eben um 10'000 Pixel aus dem sichtbaren Bereich zu schieben müßte ebenfalls gehen.

Wieso willst Du eigentlich bei der Gelegenheit noch Labels setzen lassen? Hätte sowas denn mit einem Verschwindenlassen zu tun?

0

repaint() hätte auf den Button auch keinerlei Effekt, repaint löscht nur alles, was der Bildschrim selbst gezeichnet hat(den gleichen Effekt hat es, das Fenster kurzzeitig zu minimieren) paint() sollte dann das gelöschte wieder ergänzen.

Warum implementierst du den ActionListener nicht in ButtonLoeschen selbst?

Auch button.repaint() hat keinerlei Effekt.

Warum genau geht es nicht? Passiert einfach nichts, oder gibt es einen Compilerfehler?


MrSummer 
Fragesteller
 29.06.2013, 10:57

Wenn man auf den Button klickt, wird dieser markiert und unbrauchbar. (fenster.remove(button)) Jetzt will ich nur noch den button aus dem GUI entfernen. Mit repaint() scheint es nicht zu gehen. Gibt es irgendeine andere Möglichkeit?

0
PerfectMuffin  29.06.2013, 11:00
@MrSummer

Durch remove(button) WIRD der Button entfernt, ich weiß nicht was da los ist.

0
MrSummer 
Fragesteller
 29.06.2013, 11:03
@PerfectMuffin

Sehr seltsam. Bei mir verschwindet der Button nur, wenn ich danach den Befehl fenster.repaint() gebe.

0
PerfectMuffin  29.06.2013, 11:05
@MrSummer

Ach, jetzt sehe ich's.

Es ist nicht "fenster.remove(button)", sondern contentPane.remove(button), denn der Button ist ja nur indirekt im Fenster.

0
MrSummer 
Fragesteller
 29.06.2013, 11:11
@PerfectMuffin

contentPane kann ich ja im buttonListener nicht aufrufen. Jetzt habe ich ein weiteres Attribut eingeführt (private Container container) und dann im Konstruktor container = contentPane definiert. Dann habe im buttonListener den Befehl container.remove(button) gegeben.

Es besteht immer noch das selbe Problem.

0
PerfectMuffin  29.06.2013, 11:46
@MrSummer

Versuch' mal das hier:

public void actionPerformed(ActionEvent e){

    Button b=e.getSource();
    Container c=b.getParent();
    c.remove(b);

}

Die Methode ist narrensicher und du musst noch nicht einmal die Objektorientierung dafür quälen.

0
MrSummer 
Fragesteller
 29.06.2013, 12:02
@PerfectMuffin

Dort bekomme ich die Fehlermeldung:

incompatible types - found java.lang.Object but expected java.awt.Button

0
PerfectMuffin  29.06.2013, 13:16
@MrSummer

Ups, mein Fehler.

Button b=(Button)e.getSource();

Ob Button oder JButton ist egal.

0