Portal > Foren > Java > Desktop-Applikationen und Grafik > Inhalt von JFrame ändern
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 26.04.2005, 12:45 Nach oben    #1
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard Inhalt von JFrame ändern

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
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.04.2005, 13:17 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Bei einem JFrame musst du immer mit getContentPane() arbeiten.
D.h. statt meinApplet.removeAll() musst du meinFrame.getContentPane().removeAll() benutzen.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.04.2005, 19:39 Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

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);
    }
Eigentlich dachte ich, dass der bisherige Inhalt des Fensters verschwindet wenn ich "Neue Mail" drücke und test angezeigt wird.

Klappt aber nicht.
Wo liegt denn der Fehler?

Gruß
Sparrow
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.04.2005, 20:48 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Wird neue Mail überhaupt ausgeführt?
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.04.2005, 00:14 Nach oben    #5
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

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
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.04.2005, 07:38 Nach oben    #6
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

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.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.04.2005, 08:32 Nach oben    #7
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 432
Standard

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
Sym ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.04.2005, 09:07 Nach oben    #8
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Zitat:
Zitat von TheDragonMaster
Warum verwendest du eigentlich nicht CardLayout? Das bietet sich doch förmlich für deine Sachen an.

Oder noch wesentlich besser: CardPanel.
Ne, das Card-Layout ist eigentlich nicht das richtige.
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:
Zitat von Sym

Werden denn alle Elemente entfernt?

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
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.04.2005, 22:34 Nach oben    #9
Neuer Benutzer
 
Registriert seit: 02.09.2004
Beiträge: 22
Standard Vielleicht????

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
franz77 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.04.2005, 02:15 Nach oben    #10
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

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
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.04.2005, 22:28 Nach oben    #11
Neuer Benutzer
 
Registriert seit: 02.09.2004
Beiträge: 22
Standard Vorschlag

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
franz77 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.05.2005, 14:52 Nach oben    #12
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

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
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2005, 13:23 Nach oben    #13
bluelight
Gast
 
Beiträge: n/a
Standard

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
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2005, 22:31 Nach oben    #14
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Darf ich ein wenig Code sehen?
In der Regel würde es bei einem JPanel in etwa so funktionieren:

PHP-Code:
JPanel panel = new JPanel();
panel.add(new JComponent);
panel.removeAll(:(
pane.add(new JComponent);
panel.doLayout(); 
sparrow ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2005, 12:48 Nach oben    #15
bluelight
Gast
 
Beiträge: n/a
Standard

so habe ich das gemacht, trotzdem hat es den Efekt wie oben beschrieben. Ich werde dieses Problem auf einer anderen Weise umgehen.
Vielen Dank für eure Hilfe
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ä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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45