noch nicht erzeugte Objekte killen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • noch nicht erzeugte Objekte killen

    Hallo beisammen,

    kann ich Objekte killen, welche eventuell erst zur Laufzeit erzeugt werden?

    Es geht darum, dass ich 3 versch. Button habe, welche jeweils ein JPanel Objekt auf einem JFrame erzeugen.
    Problem ist, dass wenn ich Pane1 aufrufe und dann auf den 2 Button klicke, liegen die beiden Panes übereinandern.

    Da die Objekte ja erst beim Buttonklick erzeugt werden, kann ich sie ja nicht einfach auf invisible oder null setzen.

    Gibt es vielleicht die Möglichkeit zu sagen, dass wenn zur Laufzeit eines der drei Objekte läuft, nur das aktuell-erzeugte am Leben bleibt?

    Vielleicht eine Art Schleife die über alle Objekte rüberläuft und guckt, ob eines der 3 (Pane1 - Pane3) Aktiven nicht aktiv sein sollte und es anschließend killt?


    Danke
  • Du kannst das ganze etwas einfacher

    Quellcode

    1. class Beispiel {
    2. JPanel panel1 = null;
    3. JPanel panel2 = null;
    4. // Code...
    5. // mehr...
    6. //puh.. noch mehr..
    7. public void Button1Click() {
    8. panel1 = new Panel();
    9. //code...
    10. }
    11. public void Button2Click() {
    12. if(panel1 != null) {
    13. panel1.setVisible(false);
    14. panel1.dispose();
    15. panel1 = null;
    16. }
    17. panel2 = new JPanel();
    18. }
    19. }
    Alles anzeigen


    Achtung das ganze ist halb prosa ;) Also mit kopieren wird das nüx ;)
    So oder ähnlich kannst du das machen denke ich :)

    Auch die Prüfung auf null solltest du überdenken bzw. eventuell einen anderen Weg überlegen.
    isDisplayable() kannst du dir auch mal anschauen.

    Außerdem solltest du den setVisible,dispose und = null Teil auslagern, da du es ja mit panel1, 2 und 3 machen können willst und nicht 3 gleiche Abfragen haben möchtest.

    Viel erfolg :)


    EDIT: und hafner war schneller... remove ist auch gut, wusste nur nicht mehr genau ob es die gibt... sollte mal wieder gui anwendungen schreiben :D Aber dieser schwarz/weiß Kontrast einer Konsole ist einfach unübertrefflich ;)
  • Hallo,

    danke für die Hilfe.
    Allerdings kann ich mit Harfners Antwort noch nicht all zuviel anfangen, da removeAll() ja auch alle weiteren Objekte entfernt und ich bei remove() ja nichts zum übergeben habe.
    F0kus' Lösung sieht zwar nett aus, allerdings findet er a) das Objekt nicht und b) meckert er rum, dass zB " setVisible(false) in JComponen is non static".


    Danke


    //edit:
    achso, es ist ja nicht gegeben, dass alle 3 Button geklickt werden. nur zur Info ;)
  • ali g schrieb:

    Hallo,

    danke für die Hilfe.
    Allerdings kann ich mit Harfners Antwort noch nicht all zuviel anfangen, da removeAll() ja auch alle weiteren Objekte entfernt und ich bei remove() ja nichts zum übergeben habe.
    F0kus' Lösung sieht zwar nett aus, allerdings findet er a) das Objekt nicht und b) meckert er rum, dass zB " setVisible(false) in JComponen is non static".


    Danke


    Er findet welches Objekt nicht?
    Un zum non Static... du scheinst es auf die Klasse selber anwenden zu wollen.
    Zeigt mal bitte deinen Code :)
  • ja sorry, der Code ist nur deswegen gerade sehr unübersichtlich, daher wollte ich erstmal aufräumen ;)

    Hier ist der Aufruf. Ich speichere den Spaß ja in einer Variablen, diese kann ich ja aber trotzdem erst aufrufen, wenn sie exsitiert.

    Quellcode

    1. void Button1_actionPerformed(ActionEvent e) {
    2. label1 lb = new labe1();
    3. mainpanel.add("test",lb);
    4. setTitle( "test" );
    5. }


    Quellcode

    1. public class label1 extends JPanel {
    2. private JTextArea txt_datum = new JTextArea();
    3. private JTextArea txt_datum2 = new JTextArea();
    4. private JLabel label_sep = new JLabel();
    5. private JTextField txt_name = new JTextField();
    6. private JLabel txt_label1 = new JLabel();
    7. private JButton button = new JButton();
    8. public label1() {
    9. try {
    10. jbInit();
    11. } catch (Exception e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. private void jbInit() throws Exception {
    16. //Objekte auf Label1 setzen und modifizieren
    17. //mehr Code mit ActionListener usw
    18. }
    19. }
    Alles anzeigen


    Soo, ist ja an sich nicht so spannend, wie das Label1 aufgebaut ist. Falls doch, einfach schreien. Es läuft jedenfalls.
    Genauso sehen meine anderen Klassen auch aus.

    Vielen Dank

    /edit:

    Un zum non Static... du scheinst es auf die Klasse selber anwenden zu wollen.

    jo (auch), aber ich dachte, dass es immernoch besser sei, als auf die Referenz, da diese ja noch nichtmal exsistiert ;)
  • nöp. bis auf "Method dispose() not found" meckert er nicht weiter.
    leider hilft auch das repaint nicht.

    Nochmal kurz zur Geschichte meine Progrämmchens:
    Ich habe erst alles in eine Klasse geschrieben. Da ich die JPanes direkt am Anfang initialisiert habe, konnte ich sie wann auch immer ich wollte aufrufen und invisible setzen.
    Da auf jeden Panel noch mehere Objekte und deren ActionPerformer sind, wars mir schnell zu unübersichtlich und daher habe ich u.a. die Panel ausgelagert.


    Vielleicht hilft das zur Fehleranalyse.

    Danke
  • Die Anzeige von Swing-Komponenten zu aktualisieren ist etwas was viele Nerven kosten kann. Ich habe es mal in einem meiner Programme recht hübsch gelöst.

    Meine Klasse, die von JFrame erbte bekam folgende Methode:

    Quellcode

    1. private JPanel currentPanel;
    2. public void activatePanel(JPanel panel)
    3. {
    4. remove(currentPanel);
    5. currentPanel = panel;
    6. add(currentPanel);
    7. validate();
    8. repaint();
    9. }
  • Hey,
    super nett, dass ihr euch so geduldig um mich kümmert ;)

    zu harfners Code: ich weiß leider nicht, wie und wo ich ihn anwende.

    Ich bin auch gerade dabei, dass ganze von null im Kleinen zu konstruieren, ich werde beim copy/paste wohl irgendeinen logischen Fehler drin haben.

    danke


    //Edit:
    im Anhang findet ihr eine vereinfachte Form meines Programms

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ali g ()

  • ali g schrieb:

    Ah danke soweit...

    So sieht meine neue Frame1 aus: hier. richtig so?

    Ich habe die beiden Panel einfach global definiert und beim "alles ausblenden button" scheints auch zu klappen, nur bei den beiden anderen nicht.


    Danke und hoffentlich auf ein letzen Post in diesem Fred :D



    Japp, du solltest du Panels global definieren ;)

    Aber warum hast du das nur teilweise gemacht?
    Schau mal bei den Buttons: panel1_anzeigen_actionPerformed, jButton2_actionPerformed..

    Da tritt wieder der Shadowing-effekt auf... nimm dich vor dem in Acht.