Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 20

Thema: Panel löschen (GUI neu aufbauen)

  1. #1
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56

    Panel löschen (GUI neu aufbauen)

    Hallo!

    Ich hab in meiner GUI ein contentPane, auf dem verschiedene andere Panels sind. Jetzt möchte ich, dass wenn ein Button geklickt wird, sich das aussehen der GUI ändert, sprich die GUI muss neu aufgebaut werden.

    Ich hatte mir folgendes überlegt:

    Code:
    contentPane.removeAll();
    contentPane = null;
    pane1 = null;
    pane2 = null;
    initialize();
    meine initialize()-Funktion sieht so aus:
    Code:
    private void initialize() {
    
    	[...]
    	this.setJMenuBar(getMyMenuBar());
    	this.setContentPane(getMyContentPane());
    	this.setTitle("Titel");	
            [...]
    }
    die Funktion getMyContentPane() initialisiert dann die anderen Panels (in dem Stil, wie der Eclipse GUI-Builder das aufbaut).

    Leider funktioniert es so nicht richtig, d.h. ein Teil er GUI wird richtig dargestellt, zum Teil werden aber Panels doppelt gezeichnet oder verschoben. Gibt es da vielleicht einen besseren weg?

    Danke!

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    .updateUI() auf jedes geänderte Element sollte gehen.

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56
    Ok, also wenn ich zB 2 Panels hab (wobei das blockPane auf dem contentPane liegt) die neu gezeichnet werden sollen würd ich dann

    Code:
    // null setzen damit sie beim Aufruf von getXXPane() neu intialisiert werden
    blockPane = null;
    contentPane = null;			
    getBlockPane().updateUI();
    getMyContentPane().updateUI();
    schreiben? Dann ändert er leider gar nix...

  4. #4
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Yepp - plus auf alle Komponenten, die draufliegen: Buttons, Labels,...

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  5. #5
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56
    Danke für die schnelle Antwort, aber irgendwas mach ich noch falsch. Hab das Problem erst mal reduziert und möchte ein Panel neu zeichnen. Das Panel ist ein normales JPanel, auf dem sich "Blocks" befinden. "Block" ist eine abgeleitete Klasse von JPanel.

    Mein Code:
    Code:
    blockPane = null;
    
    // alle Komponenten updaten				
    
    
    for(int i = 0; i < getBlockPane().getComponentCount(); i++) {
    
    	((Block) getBlockPane().getComponent(i)).updateUI();
    
    }
    getBlockPane().updateUI();
    es kommt kein Fehler, aber leider ändert sich auch nichts.

  6. #6
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Ich hätts mit repaint versucht.
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  7. #7
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Versuch mal einfach ein .update() auf die Komponenten.

    Frage: Wieso machst du überhaupt nen Typcast?

    getBlockPane().getComponent(i).updateUI();

    sollte doch auch gehen?

    MfG Bischi

    PS: .updateUI() funktioniert auf jeden Fall: Ich hab das mal in nem Programm verwendet, um das L&feel bei allen Komponenten umzustellen...

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  8. #8
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56
    Zitat Zitat von bischi
    Wieso machst du überhaupt nen Typcast?

    getBlockPane().getComponent(i).updateUI();

    sollte doch auch gehen?
    Also ohne den Cast gehts nicht. Muss allerdings was korrigieren: "Block" erbt von JLabel, nicht von JPanel.

    Code:
    Versuch mal einfach ein .update() auf die Komponenten.
    Nur update()? Ist die nicht für Graphics Objekte? Oder hab ich das jetzt falsch verstanden?

    @Waxolunist
    hast du mal ein ganz simples Beispiel? reicht es, repaint() auf das Panel anzuwenden? Oder auch auf alle Komponenten?

  9. #9
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    ev hilft auch ein setVisible(false) und anschliessendes setVisible(true) auf das ganze Fenster/Pane.

    Versuchs mal mit nur einem Button, den du auch gleich als Variable abspeicherst... Ich bin ganz fest der Meinung, dass updateUI gehen müsste...

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  10. #10
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56
    Zitat Zitat von bischi
    Versuchs mal mit nur einem Button, den du auch gleich als Variable abspeicherst... Ich bin ganz fest der Meinung, dass updateUI gehen müsste...
    Ich hab mal versucht, ein ganz einfaches Beispiel zu erstellen. Ein Label und ein Button auf einem Panel. Wenn der Button geklickt wird, soll sich der Text vom Label ändern, indem die Komponente neu gezeichnet wird.

  11. #11
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Also bei mir funktioniert folgender Code:

    Code:
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    
    public class Test extends JFrame {
    
    	private JButton jButton;
    	private JLabel jLabel;
    	private JPanel jPanel;
    
    	
    	public Test() {
    		this.setSize(300, 200);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		
    		Container cp = getContentPane();
    		cp.setLayout(null);
    		
    		jButton = new JButton("Los!");
    		jButton.setBounds(0,10,100,50);
    		jButton.addActionListener( new ActionListener(){
    			public void actionPerformed(ActionEvent e){
    				jLabel.setText("Nachher");
    			}
    		});
    		cp.add(jButton);
    		
    		jPanel = new JPanel(new BorderLayout());
    		jPanel.setBounds(0,60,300,100);
    		cp.add(jPanel);
    				
    		jPanel.add(jLabel = new JLabel("Vorher"));
    		
    		this.setVisible(true);
    	}
    	
    	public static void main(String[] args){
    		Test test = new Test();
    	}
    }
    Sogar ohne updateUI() (was nach API auch wirklich nur für L&F bestimmt wäre...)

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  12. #12
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56
    sorry, das war jetzt irgendwie ein Missverständnis. Dass das mit jLabel.setText() funktioniert ist klar Und sicherlich auch die sinnvollste Lösung), ich wollte den Austausch des Textes aber erreichen, indem die Komponente neu gezeichnet wird, war etwas unglücklich als Beispiel gewählt.

    Aber wenn du noch mal Zeit hast: wie würdest du es machen, wenn du zB drei JLabels hast und auf Button-Klick sollen zwei verschwinden und das dritte eine neue Größe und Farbe bekommen? Mein Wunsch wäre da, dass die Labels neu initialisiert werden und anschließend neu auf das Panel gelegt werden und genau daran scheiter ich.

  13. #13
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von lousypoetry
    Aber wenn du noch mal Zeit hast: wie würdest du es machen, wenn du zB drei JLabels hast und auf Button-Klick sollen zwei verschwinden und das dritte eine neue Größe und Farbe bekommen?
    Panel von contentpane entfernen (cp.remove(jPanel)), danach panel neu erstellen und Knöpfe/Label neu drauf setzen...

    MfG Bischi

    PS: Ähnliches Problem: http://www.mrunix.de/forums/showthre...d=1#post207515

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  14. #14
    Registrierter Benutzer Avatar von lousypoetry
    Registriert seit
    10.04.2005
    Beiträge
    56
    Zitat Zitat von bischi
    Panel von contentpane entfernen (cp.remove(jPanel)), danach panel neu erstellen und Knöpfe/Label neu drauf setzen...
    Das hört sich logisch und einfach an, aber es will bei mir nicht klappen.
    ich komm soweit, dass er mir auf das Panel, was ersetzt werden soll, die neuen Komponenten setzt (hab ich per Ausgabe geprüft). Sichtbar sind aber trotzdem nur die alten. Darum dachte ich ja, es liegt daran, dass irgendwas nicht neu gezeichnet wird.

    Ich hab mal ein Beispiel angehängt, wo ich das versucht hab. Wenn man auf den Button klickt, soll im Panel ein anderer Button durch ein Label ersetzt werden (d.h. der Button soll runter vom Panel, das Label drauf). Ich find nur meinen Fehler leider nicht.

  15. #15
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Könntest du das Beispiel mal ausführbar machen (mit main und allem gesetzt - so dass ich das nur noch zu kompilieren brauch?). Hab keine Lust, wieder am ganzen Code so lange rumzubasteln, bis ichs überhaupt testen kann...

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •