LayoutManager GUI-Design: eventuelle Alternativen zum Verschachteln + Ansprechen von JPanel()?

baphomet13

Mitglied
Liebe Alle,

ich habe zwei Fragen, die aber miteinander zu tun haben und die ich deshalb gerne in diesem Thread zusammenfassen würde: eine generellere Frage zum GUI-Design, eine zur Steuerung des Inhalts von JPanels.

1. GUI-DESIGN: Ich habe bspw. ungefähr folgendes Layout vor:

Code:
 _____________________________________________________
| (1) Menüleiste                                      |
 -----------------------------------------------------
| (2) Toolbar                                         |
 -----------------------------------------------------
|                                                     |
| (3) Steuerungselemente (Buttons/Dropdownlisten)     |
|                                                     |
 -----------------------------------------------------
|                                                     |
| (4) Anzeigefenster (je nach Auswahl in              |
| den Steuerungselemente JTextField oder JTable)      |
|                                                     |
 -----------------------------------------------------

(3) wird u.U. als JTabbedPane gelöst, ist zunächst aber ein JPanel().

Habe das Ganze mit verschachtelten LayoutManagers gelöst (v.a. BorderLayout):

Java:
public class Gui extends JFrame implements ActionListener {
	
    /* Class Variables */
	private JLabel l1, l2, l3;
	private JPanel mainPanel, toolPanel, outputPanel;
	
    public Gui (String textVal)
    {
    	super("Titel");
        
        //Create and set up the window.
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        setJMenuBar(createMenuBar());
        setContentPane(createContentPane());
        
        // *** DO STUFF ***
        l1 = new JLabel("Start");
        l2 = new JLabel();
        l3 = new JLabel();
        JToolBar toolb = new JToolBar();
        JButton b1 = new JButton("Button 1");
        b1.addActionListener(this);
        b1.setActionCommand("b1");
        JButton b2 = new JButton("Button 2");
        toolb.add(b1);
        toolb.add(b2);
        getContentPane().add(BorderLayout.NORTH,toolb);
        
        // mainPanel in CENTER of getContentPane
        mainPanel = new JPanel(new BorderLayout());
        mainPanel.setBackground(Color.RED);
        getContentPane().add(BorderLayout.CENTER,mainPanel);
        
        // toolPanel in NORTH of mainPanel
        toolPanel = new JPanel();
        toolPanel.setBackground(Color.yellow);
        mainPanel.add(BorderLayout.NORTH,toolPanel);
        
        // outputPanel in CENTER of mainPanel
        outputPanel = new JPanel();
        outputPanel.setBackground(Color.green);
        mainPanel.add(BorderLayout.CENTER,outputPanel);
        
        // JLabel l2 (emtpy until now) in outputPanel -> to be changed by Action
        /** ACTION SOLLTE DANN L2 REMOVEN UND L3 SCHREIBEN  **/
        l2 = new JLabel("Zustand Eins");
        outputPanel.add(l2);
        
        //Display the window.
        pack();
        setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
        setVisible(true);

Code ist noch unvollständig und beinhaltet Platzhalter.

Element (4) (das JPanel() outputPanel) soll variabel besetzt werden können. Frage 1 ist nun: ist dies Verschachtelung der JPanel()s mit LayoutManagern die beste Möglichkeit oder gibt es elegantere Möglichkeiten, so ein Desing umzusetzen?

2. ANSPRECHEN VON outputPanel: Meine Idee war hier, dass je nach Auswahl bzw. Action im toolPanel der Inhalt von outputPanel belegt wird, also dass per Default ein JTextField() angezeigt wird, wenn man aber einen Button im toolPanel klickt bspw. eine JTable(), ein JLabel() o.ä. angezeigt wird. Ich hätte jetzt instinktiv versucht, jeweils das outputPanel per new JPanel() neu und leer zu instanziieren und dann das gewünschte Element zu adden
Java:
outputPanel.add(new JTextField());

Frage 2 ist also, ob das a) funktioniert (das würde ich im Zweifesfall selbst ausprobieren, falls niemand "Halt!" ruft, ich erwarte keinen fertigen Code) und b) die beste (kürzeste/eleganteste) Möglichkeit ist, bzw. welches bessere Variante es gibt.

Vielen herzlichen Dank für Mühe, Geduld und Hilfe!
B13
 
Zuletzt bearbeitet:
Verschachteln ist OK. Es sollte wohl nicht zuuuu tief werden, aber wenn man das ein bißchen in Methoden aufteilt, z.B. wie in diesem Post grob angedeutet, bleibt das Handhhabbar.
Als Alternative würde hier vielleicht ein BoxLayout in Frage kommen (oder natürlich das allmächtige GridBagLayout oder ein anderer, mächtigerer LayoutManager), aber eigentlich ist das BorderLayout dafür IMHO perfekt geeignet.

Das "Ansprechen" ... alte Components enfernen und neue Einfügen kann schon sehr frickelig werden. Im allgemeinen ist man da mit einem How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container) deutlich besser bedient.
 
Das "Ansprechen" ... alte Components enfernen und neue Einfügen kann schon sehr frickelig werden. Im allgemeinen ist man da mit einem How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container) deutlich besser bedient.

Ah, daran hatte ich gar nicht gedacht. :toll:

Ich nehme an, dass das Aufrufen der Cards über beliebige Steuerelemente erfolgen kann, insofern wird das die beste Möglichkeit sein. Danke!

Re Verschachteln, das dürfte in meinem Fall nicht besonders tief werden, insofern bleibt der Überblick gewahrt 🙂.
 

Zurück
Oben