![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Ich steh hier vor einem sehr seltsamen Problem... Ich habe ein JFrame, das einige Buttons und eine Liste enthällt. Wenn ich einen der Buttons drücke möchte ich, dass sich der gesamte Inhalt des JFrames ändert. Habs versucht wie bei den Applets: removeAll(); und dann einfach die neuen Komponenten adden.. klappt aber nicht. Was muß ich tun? Der Grund dafür ist, dass ich aus einem Applet heraus ein JFrame (als PopUp) öffne. Wenn ich jetzt den Inhalt ändern will (also Knopfdruck), möchte ich das JFrame aber weiterbenutzen und nicht ein weiteres öffnen. Habs auch schon mit .setContent versucht, klappt aber auch nicht. Gruß Sparrow |
| | |
| | Nach oben #2 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Bei einem JFrame musst du immer mit getContentPane() arbeiten. D.h. statt meinApplet.removeAll() musst du meinFrame.getContentPane().removeAll() benutzen.
__________________ Patrick Gotthardts Weblog. |
| | |
| | Nach oben #3 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Klappt nicht. Hier der stark verkürzte Code des Programms: Code: private void postfach() {
postf = new JPanel();
postf.setLayout(new BorderLayout());
// Überschrift
JPanel oben = new JPanel();
oben.setBackground(Color.BLACK);
JLabel uber = new JLabel("Postfach:", JLabel.CENTER);
uber.setForeground(Color.GREEN);
oben.add(uber);
postf.add(oben, BorderLayout.NORTH);
// Panel im Center
JPanel center = new JPanel();
center.setBackground(Color.BLACK);
// Panel unten
JPanel unten = new JPanel();
unten.setBackground(Color.BLACK);
// Einfügen den Buttons
JButton newMail = new JButton("Mail schreiben");
newMail.addActionListener(this);
unten.add(newMail);
postf.add(unten, BorderLayout.SOUTH);
// Lege JPanel posft auf den Bildschirm
this.getContentPane().add(postf);
}
// Die Aktionen für die Buttons
public void actionPerformed(ActionEvent event) {
String str = event.getActionCommand();
if (str.equals("Mail schreiben")) {
neueMail();
}
}
private void neueMail() {
this.getContentPane().removeAll();
JLabel test = new JLabel("Test");
test.setForeground(Color.GREEN);
this.getContentPane().add(test);
}
Klappt aber nicht. Wo liegt denn der Fehler? Gruß Sparrow |
| | |
| | Nach oben #4 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Wird neue Mail überhaupt ausgeführt?
__________________ Patrick Gotthardts Weblog. |
| | |
| | Nach oben #5 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Definitv ja. Kann sein das ich beim kürzen vom code zuviel weggenommen habe, aber es wird definitiv ausgeführt. ich hab das gefühl das ich hier wieder irgendwas mit doLayout() machen muss, komme aber nicht dahinter. Gruß Sparrow |
| | |
| | Nach oben #6 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.129
|
Warum verwendest du eigentlich nicht CardLayout? Das bietet sich doch förmlich für deine Sachen an. Oder noch wesentlich besser: CardPanel.
__________________ Patrick Gotthardts Weblog. |
| | |
| | Nach oben #7 |
| Chefkoch-Mod Registriert seit: 30.05.2004
Beiträge: 432
|
Werden denn alle Elemente entfernt?
__________________ Denk mal darüber nach... Lars ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen. www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de |
| | |
| | Nach oben #8 | ||
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
| Zitat:
Im Prinzip soll ja das gesamte Frame, inklusive Layout überschrieben bzw. erneuert werden. Ein Card-Layout nützt mir also eigentlich nichts. Vielleicht hab ich mich aber auch falsch ausgedrückt, die Hauptaufgabe für die Buttons ist es ja nicht das Frame zu ändern, sondern eigentlich soll eine Aktion ausgeführt werden. Der "Neue Mail"-Button ist der einzige Button der 'nur' das Frame ändern soll. Zitat:
Jain. Also eigentlich nein. Sobald ich den Button drücke friert die Anzeige ein (mit gedrücktem Button). Andererseits funktionieren die Buttons nicht mehr, es liegt aber keine Exception oder Error vor. Ich nehm mal an, dass die Elemente zwar "entfernt" werden, aber es keine Aktualisierung des Frames, bzw. der Anzeige, gibt. Gruß Sparrow | ||
| | |
| | Nach oben #9 |
| Neuer Benutzer Registriert seit: 02.09.2004
Beiträge: 22
|
Verstehe ich Dich richtig? Der Button an dem die Ereignisbehandlungsmethode hängt soll sich durch drücken selbst entfernen? Der Button delegiert den Aufruf an den JFrame (implements ActionListener)- innerhalb der Methode werden die Buttons entfernt. Wohin springt der die Methode actionPerformed zurück? (Ist mir zu spät um selber noch länger darüber nachzudenken) MfG! Franz |
| | |
| | Nach oben #10 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Genau. Theoretisch soll sich der Button selbst entfernen. Allerdings ist er ja zu dem Zeitpunkt eigentlich schon gar nicht mehr existent, nur noch für den Layout-Manager. Denn: Der Button wird ja in der Methode mit new angelegt und initialisiert. Er ist also nicht als Klassenobjekt (heißt das so? -> Klassenvariable) angelgt. Der ActionListener ist ja aktiv, er soll ja nur alles was auf dem JFrame liegt entfernen und eine andere Methode aufrufen. Diese neue Methode fügt dann die neuen Komponenten auf den JFrame ein. Es funktioniert ja auch alles, die aufzurufende Methode wird angesprochen und läuft durch. Nur die Anzeige ändert sich nicht. bei einem Applet funktioniert das ganze ohne Probleme, dort bin ich deshalb so vorgegangen damit ich mit modular aufgebauten Klassen auf das Applet je nach aufgerufener Klassen Komponeten einfügen kann. Wo die Komponenten eingefügt wurden ist dann egal. Ein appletInstanz.removeAll() macht den Appletbildschirm wirder blank, dann fügen die Klassen ihre Panels ein und mit doLayout() sorge ich dafür das für jedes Panel und für das Applet das Layout angewandt und angezeigt wird. Gruß Sparrow |
| | |
| | Nach oben #11 |
| Neuer Benutzer Registriert seit: 02.09.2004
Beiträge: 22
|
Naja ich habe so meine Zweifel darüber, wo der Ausführungszeiger hinspringen soll, wenn er die Ereignisbehandlungsroutine durchlaufen hat. Es passiert doch fiolgendes: Der Button erhält den Klick und gibt das Ereignis über die Schnittstelle ActionListener an Deinen MainFrame weiter. Dieser löscht dann in der actionPerformed(...) Methode die Buttons. Und genau hier denke ich könnte das Problem liegen. Die Code Ausführung muss doch nach actionPerformed wieder in den Buttons weitergehen. (Der Button ruft intern doch nur an dem DefaultButtonModel fireActionPerformed( new ActionEvent(this, ActionEvent.ACTION_PERFORMED, getActionCommand(), EventQueue.getMostRecentEventTime(), modifiers)); auf, diese delegiert jetzt an dein ActionListener interface in MainFrame. Und dort wird der Button evtl. schon zerstört. Da hat zur Folge, dass die actionPerformed Methode nicht mehr zu fireActionEvent im DefaultButtonModel Deines Buttons zurückkehren kann. ...So hab ich mir das ausgeknobelt... ???) Vielleicht kann folgendes helfen - einen eigenen ActionLsitener für die Button, statt einen am JFrame: buttonXYZ.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { MainFrame.this.getContentPane().removeAll(); } }); Gruss! Franz |
| | |
| | Nach oben #12 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Hm, ok das werde ich ausprobieren. Allerdings kann ich mir das nur schwer vorstellen. Der Actionlistener bleibt ja erhalten -> und ruft eine neue Methode auf. Diese neue Methode läuft dann durch, nimmt änderungen am Layout vor und wartet wiederum auf ein Event. Wie gesagt in Applets funktioniert das alles super. Irgendwie fehlt mir nur das Kommando "aktualisiere die Datstellunge des Layouts". Bei Applets muss ich nur das Applet und alle darin eingebetteten Panels entgegengesetzt ihrer Verschachtelung mit doLayout() dazu bringen das Layout zu aktualisieren: applet.doLayout(); panel1.doLayout(); panel1_1.doLayout(); panel2.doLayout(); [...] und zack werden änderungen am und im layout direkt dargestellt. Grüße Sparrow |
| | |
| | Nach oben #13 |
| Gast
Beiträge: n/a
|
Ich hab ein ähnliches Problem, auch bei mir soll sich nach dem Klicken auf ein Button die Zusammensetzung der Komponenten ändern. Also sollten die Komponenten mit removeAll() enfernt und dann mit add() neue hinzzugefügt werden. Allerdings hat das removeAll nur den Effekt das bei den nächsten add() aufrufe die alten Komponenten überschrieben werden. Das heißt aber, dass wenn weniger Komponenten hinzufügt einige alte stehen bleiben. Wie kann ich alle alten Komponenten löschen ohne das sie stehen bleiben. Ich hoffe ihr könnt mir helfen. Vielen Dank schon mal im Vorraus Adrian |
|
| | Nach oben #14 |
| Sesselkleber Registriert seit: 17.01.2005
Beiträge: 581
|
Darf ich ein wenig Code sehen? In der Regel würde es bei einem JPanel in etwa so funktionieren: PHP-Code: |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| YAML, Inhalt links, Sidebar rechts, Inhalt vor Sidebar im Quelltext | Ben | HTML, XML und CSS | 20 | 22.03.2007 18:26 |
| [PHP] FTP-Funktionen in PHP nutzen | MrNiceGuy | Tutorials | 0 | 24.05.2006 14:18 |
| 2. JFrame von 1. JFrame aus starten und schließen | Lautsprecher | Desktop-Applikationen und Grafik | 5 | 15.11.2005 09:28 |
| JFrame Inhalt beim Klick in der JMenuBar | Maximum | Desktop-Applikationen und Grafik | 10 | 10.03.2005 17:12 |
| Inhalt in einer jComboBox alphabetisch sortieren | Immi_Himself | Desktop-Applikationen und Grafik | 2 | 16.11.2004 15:40 |