JPanels austauschen?

Status
Nicht offen für weitere Antworten.

TorstenTKH

Mitglied
Folgendes Problem:
Ich habe einen Frame mit BorderLayout. Im Norden ist eine Toolbar verankert. Diese ist mit diversen Buttons besetzt.
Auf Aktion eines Buttons, soll dann im Center jeweils das gültige Panel (Eingabe, Ausgabe, Optionen etc...) geschaltet werden. In der Testphase existieren nur Ein- und Ausgabe.
Hieraus ergibt sich:
- über println ist nachzuvollziehen, dass die Buttons funktionieren und auch dass in die jeweiligen add und rem-Methoden verzweigt wird.
- Jeder Button macht exakt 1x das was er soll, danach findet keine Änderung der Panels mehr statt.

was ich ausprobiert habe:
- Versuch beide Panels gleichzeitig im Center zu haben und eins auf Visible(true) das andere auf false zu setzen, bringt keinen Erfolg
- validate() und repaint() austauschen, keine Änderung
- wennn ich das EingabePanel im Westen und das AusgabePanel im Center habe, funktioniert das Programm. ist optisch aber nicht das was ich mir vorstelle
- removeall() und jedesmal dann die Toolbar wieder einfügen, führt dazu, dass die Toolbar jedesmal neu eingesetzt wird, ansonsten das alte Problem, jeder Button nur 1x

Verständnisfragen:
- ist es überhaupt möglich auf diese Art und Weise JPanels (mit ihrem Inhalt) auszutauschen?
- ich hatte an anderer Stelle gelesen, dass Threadsicherheit evtl. ein Problem sein kann

Code:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class fenster extends JFrame implements ActionListener
{
	private JToolBar myToolBar = new JToolBar();
	 	   JButton JButton1 = new JButton("Button1") ;
	           JButton JButton2 = new JButton("Button2") ;
                   JPanel EingabePanel = new JPanel();
                   JPanel AusgabePanel = new JPanel();
	 	   ...sämtliche Buttons, Textfelder etc...
	
	public fenster (String textKopfzeile)
	{
		super (textKopfzeile);
		this.setLocation(100,100);
		this.setSize(800,600);
		this.setVisible (true);
		JToolBar myToolBar = new JToolBar();
		getContentPane().add(myToolBar, BorderLayout.NORTH);

		myToolBar.setBorder(BorderFactory.createEtchedBorder() );
		
		JButton1.setText("Button1");
		JButton1.addActionListener(this);
		myToolBar.add(JButton1);
		
		JButton2.setText("Button2");
		JButton2.addActionListener(this);
		myToolBar.add(JButton2);
		
	}
	

	public void addEingabe()
        {
                getContentPane().add (EingabePanel, BorderLayout.CENTER);
                EingabePanel.add (Labels etc.);
                System.out.println ("in addEingabe");
                this.validate(); //this.repaint() kein Unterschied
        }

        public void remEingabe()
        {
                //EingabePanel.remove (Labels etc.);
                getContentPane().remove (EingabePanel);
                System.out.println ("in remEingabe");
                this.validate(); 
        }


        //Methoden addAusgabe() und remAusgabe() sind im Aufbau wie addEingabe / remEingabe
	
        public void actionPerformed (ActionEvent event)
	{
		String cmd = event.getActionCommand();
		if (cmd.equals("Button1"))
		{
			System.out.println("Button1 gedrückt");
                        remAusgabe();
                        addEingabe();
		}
		else if (cmd.equals("Button2"))
		{
			System.out.println("Button2 gedrückt");
                        remEingabe();
                        addAusgabe();
		}
		
	}
}

Ich möchte nicht mit JTabs oder Childframes arbeiten. Momentan steckt mehr der Anreiz darin, das Problem zu lösen und nicht zu umgehen (ist eine Freizeitarbeit und dient für mich nur zum Erlernen von Swing)

Vielen Dank für Eure Hilfe
 
B

Beni

Gast
Wenn du nicht "removeAll", sondern nur ein "remove" mit dem alten Panel machst, verschwindet auch nicht deine Toolbar :wink:

Solange du das direkt im ActionListener machst, gibt es keine Probleme mit Threads. Probleme kriegst du erst, wenn du explizit irgendwo ein "new Thread()" hast, und in diesem Thread die GUI verändern willst.
 

TorstenTKH

Mitglied
wie gesagt removeall() war nur ein weiterer Versuch
der Versuch über
getContentPane().remove (AusgabePanel);
getcontentPane().add (EingabePanel, BorderLayout.CENTER);

bringt die angesprochenen Probleme.

Jedes Panel lässt sich genau 1mal anzeigen. Danach werden die Methoden zwar durchlaufen (getestet über println in den Methoden) aber es findet keine Darstellung im Frame mehr statt.
 
B

Beni

Gast
Wieso dein Code nicht funktioniert, hab ich auch nicht ganz durchblickt. Ich denke mal, dass du bei jedem "addEingabe" die "add"-Methode des Eingabepanels selbst benutzt, verursacht die Probleme.
Naja, ich habs selbst geschrieben (nach deiner Vorlage), und so sollte es funktionieren:
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;

public class Fenster extends JFrame implements ActionListener{
    public static void main( String[] args ) {
        JFrame frame = new Fenster();
        frame.setBounds( 20, 20, 600, 500 );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setVisible( true );
    }
    
    private JPanel panelGreen = new JPanel();
    private JPanel panelRed = new JPanel();
    
    private JButton green, red;
    private JPanel currentPanel;
    
    public Fenster(){
        JToolBar tools = new JToolBar();
        green = new JButton( "Grün" );
        red = new JButton( "Rot" );
        
        fill( panelGreen );
        fill( panelRed );
        
        panelGreen.setBackground( Color.GREEN );
        panelRed.setBackground( Color.RED );
        
        panelGreen.setOpaque( true );
        panelRed.setOpaque( true );
        
        Container content = getContentPane();
        content.setLayout( new BorderLayout() );
        content.add( tools, BorderLayout.NORTH );
        
        tools.add( green );
        tools.add( red );
        
        green.addActionListener( this );
        red.addActionListener( this );
        
        setPanel( panelGreen );
    }
    
    public void setPanel( JPanel panel ){
        if( currentPanel != null )
            getContentPane().remove( currentPanel );
        
        currentPanel = panel;
        if( panel != null )
            getContentPane().add( panel, BorderLayout.CENTER );
        
        getContentPane().invalidate();
        getContentPane().validate();
        getContentPane().repaint();
    }
    
    private void fill( JPanel panel ){
        panel.setLayout( new GridLayout( 4, 1, 20, 20 ));
        for( int i = 0; i < 4; i++ ){
            JButton random = new JButton();
            random.setText( String.valueOf( (int)(20 * Math.random())));
            panel.add( random );
        }
    }
    
    public void actionPerformed( ActionEvent e ) {
        if( e.getSource() == red )
            setPanel( panelRed );
        else if( e.getSource() == green )
            setPanel( panelGreen );
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JPanels auf gleicher Höhe (Y-Achse) in einem FlowLayout platzieren Java Basics - Anfänger-Themen 7
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
V Alle Komponenten eines JPanels Java Basics - Anfänger-Themen 14
L Threads Laufbild Erzeugen Problem mit Aktualisieren des JPanels Java Basics - Anfänger-Themen 2
W 2 JPanels in 2Klasse in einem JFrame zusammenfügen Java Basics - Anfänger-Themen 12
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
N Probleme beim entfernen eines JPanels Java Basics - Anfänger-Themen 4
L "Graphik" JPanels übereinander legen Java Basics - Anfänger-Themen 5
M JPanels verschachteln Java Basics - Anfänger-Themen 23
J Cannot find Symbol Variable mit JPanels Java Basics - Anfänger-Themen 2
M dynamische JPanels/Component Java Basics - Anfänger-Themen 3
M Überschreiben von JPanels funktioniert nicht! Java Basics - Anfänger-Themen 9
U Neuzeichnen eines JPanels Java Basics - Anfänger-Themen 17
A Mehere JPanels und JLabels - Warum Fehler? Java Basics - Anfänger-Themen 5
G Gesamten clickCount mehrerer JPanels herausfinden Java Basics - Anfänger-Themen 5
M JPanels vergleichen Java Basics - Anfänger-Themen 3
A Matisse oder Java Problem: JPanels werden riesig ? Java Basics - Anfänger-Themen 3
B LayoutManager Anorden von verschiedenen JPanels Java Basics - Anfänger-Themen 5
Q ActionListener event bei JPanels Java Basics - Anfänger-Themen 5
P Schriftgröße eines JPanels ändern Java Basics - Anfänger-Themen 2
T Fehlermeldung beim Klonen eines JPanels Java Basics - Anfänger-Themen 8
W JPanels löschen und neu konstruieren Java Basics - Anfänger-Themen 4
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
M Die Hamster Figur austauschen Java Basics - Anfänger-Themen 6
S Rollen verändern, Interfaces austauschen wie? Java Basics - Anfänger-Themen 10
N Werte zwischen Klassen austauschen Java Basics - Anfänger-Themen 1
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
L Array austauschen Java Basics - Anfänger-Themen 2
F Werte austauschen/übergeben Java Basics - Anfänger-Themen 10
H Sortieren durch Austauschen - GUI Java Basics - Anfänger-Themen 13
J Programm zum Buchstaben austauschen, logikproblem Java Basics - Anfänger-Themen 2
M Variablen Wie kann man ein Objekt austauschen? Java Basics - Anfänger-Themen 12
F Info zwischen verschiedene Klassen austauschen Java Basics - Anfänger-Themen 4
K Werte von 2 Klassen austauschen/ Bild im Label ändern Java Basics - Anfänger-Themen 12
-horn- In Dateian Markern Werte austauschen? Wie am elegantesten? Java Basics - Anfänger-Themen 3
P Zahlen austauschen Java Basics - Anfänger-Themen 4
E Daten zwischen Child-JFrame und Parent-JFrame austauschen Java Basics - Anfänger-Themen 2
L Zwei JFrames, Variable austauschen Java Basics - Anfänger-Themen 6
B Fensterinhalte austauschen Java Basics - Anfänger-Themen 3
S Daten zwischen Visual Klassen austauschen Java Basics - Anfänger-Themen 9
S elemente zwischen 2 jListen austauschen Java Basics - Anfänger-Themen 6
G " " in String austauschen Java Basics - Anfänger-Themen 5
J Content austauschen durch ActionListener Java Basics - Anfänger-Themen 11
M Daten zwischen Frames austauschen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben