You are not logged in.

  • Login

1

Wednesday, May 27th 2009, 7:57pm

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

2

Wednesday, May 27th 2009, 8:10pm

Man "killt" keine Objekte in Java. Wenn die Objekte nicht mehr referenziert werden, dann werden sie automatisch von Garbage Collector entfernt.

Du musst also nur dafür sorgen, dass dein Objekt nicht mehr vom JFrame referenziert wird. Dafür hast du dort eine remove() bzw. eine removeAll() Methode.

3

Wednesday, May 27th 2009, 8:11pm

Du kannst das ganze etwas einfacher

Java Quellcode

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


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 ;)

4

Wednesday, May 27th 2009, 8:26pm

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 ;)

5

Wednesday, May 27th 2009, 8:28pm

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 :)

6

Wednesday, May 27th 2009, 8:28pm

Naja, wie wäre es denn wenn du das Objekt in einer Variable speicherst. Dann kannst du es auch der remove()-Methode übergeben.

Edit:
Diesmal war F0kus schneller. Aber er hat recht. Kennst du denn die Bedeutung von static? Wenn nicht, solltest du dir dieses Wissen schnell aneignen, sonst verstehst du objektorientierte Programmstrukturen nicht.

7

Wednesday, May 27th 2009, 8:37pm

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.

Source code

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


Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class label1 extends JPanel {
  private JTextArea txt_datum = new JTextArea();
  private JTextArea txt_datum2 = new JTextArea();
  private JLabel label_sep = new JLabel();
  private JTextField txt_name = new JTextField();
  private JLabel txt_label1 = new JLabel();
  private JButton button = new JButton();


  public label1() {
    try {
      jbInit();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception {
//Objekte auf Label1 setzen und modifizieren
//mehr Code mit ActionListener usw
  }
  


  }


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:

Quoted


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 ;)

8

Wednesday, May 27th 2009, 8:44pm

Mooment, wozu erzeugst du eine neue Klasse und leitest diese von JPanel ab?? (Anmerkung: Bei Klassen den Anfangsbuchstaben bitte groß ;) )

Ich muss zugeben ich bin etwas verwirrt :(

Schau dir bitte nochmal meinen Code von oben an.
Das hatte schon seinen Grund das ich die Variablen angelegt habe, bevor du auf den Button drückst ;)

9

Wednesday, May 27th 2009, 8:48pm

ahja, ich sehe und werde gleich testen.
erweitert hat der Jdeveloper meine Klassen ;)

Ich meld mich gleich!

Danke


//edit:
nope. das Ding liegt leider immernoch im Hintergrund und versperrt mir die Sicht :/

10

Wednesday, May 27th 2009, 9:00pm

Aber keine Exception mehr?

quick and dirty lösung ist bei sowas meist: this.repaint(); dazwischenbauen ;)

also:

Java Quellcode

1
2
panel1.dispose();
this.repaint();


Ansonsten noch n panel1.setVisible(false); mit rein..

This post has been edited 1 times, last edit by "F0kus" (May 27th 2009, 9:14pm)


11

Wednesday, May 27th 2009, 9:05pm

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

12

Wednesday, May 27th 2009, 9:46pm

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:

Java Quellcode

1
2
3
4
5
6
7
8
9
10
private JPanel currentPanel;
 
public void activatePanel(JPanel panel)
{
	remove(currentPanel);
	currentPanel = panel;
	add(currentPanel);
	validate();
	repaint();
}

13

Thursday, May 28th 2009, 8:51am

Weiß zwar nicht ganz genau wie ich das verwenden soll, aber die von dir benutzen Methoden helfen leider nicht :/

Sorry für die etwas dumme Fragerei..

14

Thursday, May 28th 2009, 9:20am

Weiß zwar nicht ganz genau wie ich das verwenden soll, aber die von dir benutzen Methoden helfen leider nicht :/

Sorry für die etwas dumme Fragerei..


Hi,

versuch mal dein Problem mit Hafner's code etwas genauer zu erläutern ;)
Du verstehst nicht wo du das einfügen sollst oder was genau verstehst du nicht?

Danke ;)

15

Thursday, May 28th 2009, 11:28am

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

This post has been edited 2 times, last edit by "ali g" (May 28th 2009, 1:02pm)


16

Thursday, May 28th 2009, 12:47pm

Hi,

kannst du uns die Klassen bei http://nopaste.info/ (oder sonst irgendeinem nopaste-service) einfügen?
Wenn es nciht zuu lang wird, kannst du auch die tags hier im Forum benutzen.
Regt mehr an als wenn man sich das alles runterladen muss :)

Danke dir!

17

Thursday, May 28th 2009, 1:07pm

Na logo!
Applikation1
Frame1
Panel1
Panel2


Soo. Interessant sind eigentlich nur Frame1 + Panel1.. Panel2 ist wie Panel1 aufgebaut und die Applikation ruft den ganzen Spaß nur auf.


Danke!

18

Thursday, May 28th 2009, 1:19pm

Oh-Oh... böses Beispiel für Shadowing.

Versuch das was im Link steht auf dein Problem zu Projizieren.
Zugegeben der Link ist so lala aber ich hab grad kein besseres beispiel zu Shadowing gefunden bzw. keine Zeit eins zu schreiben ;)

Es geht im groben um Instanz und lokale Variablen die gleich heißen.
Schau mal bei dir im Code, da ist etwas ähnliches ;)

19

Thursday, May 28th 2009, 2:39pm

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

20

Thursday, May 28th 2009, 2:46pm

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.

Social bookmarks