Warum hält sich GridBagLayout nicht an die Vorgaben?

Status
Nicht offen für weitere Antworten.

hakker82

Mitglied
Hallo,

meine Versuche mit dem GridBagLayout sind böse in die Hose gegangen. Es konnte nicht so recht mit JTables umgehen. Ansonsten fand ich es großartig.

Was ich brauche: Ein Layout-Manager der JLists und JTables problemlos maximieren kann. Denn ich bastele gerade an einer GUI, die maximiert werden kann/soll.
 
Das tut leider auch nicht. Ich habe in einem JPanel mehrere Panels per GridBagLayout abgeordnet. Das sieht etwa so aus:

Code:
|-----------------|---------|
|                 |         |
|-----------------|         |
|                 |         |
|-----------------|---------|
|                 |         |
|-----------------|---------|

Jetzt soll in das eine Feld links eine JTable.

Code:
|-----------------|---------|
|                 |         |
|-----------------|         |
|        x        |         |
|-----------------|---------|
|                 |         |
|-----------------|---------|

Die soll sich an die Verhältnisse halten und nicht alles sprengen.

Screenshot (die Tabelle soll in das Cyan-farbene Feld):



nach dem Maximieren (alles verschoben, Tabelle/JScrollPane unschön):



ohne (ficheTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); schon besser, nur braucht es zu viel Platz, der muss begrenzt werden und dazu das JScrollPane genutzt werden):



Hier der Code:

Code:
package lemming.ui;

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.lang.reflect.Array;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Locale;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.filechooser.FileFilter;
import lemming.fiche.*;
import lemming.lemma.*;
import lemming.reference.*;
import lemming.rule.*;

import javax.swing.table.*;

public class Lemmatiser extends JPanel
    implements ActionListener {
    
    private FicheDBAccess ficheAccess;

    private ReferenceDBAccess referenceAccess;

    private String profileDir;

    private String ruleFilename;
    
    private GridBagLayout gbl;

    private JPanel searchPanel;

    private JPanel tablePanel;

    private JPanel listPanel;

    private JPanel buttonPanel;

    private JPanel listButtonPanel;

    private JPanel tableButtonPanel;

    public Lemmatiser(FicheDBAccess ficheAccess,
                      ReferenceDBAccess referenceAccess,
                      String profileDir, String ruleFilename) {
        super();
        this.ficheAccess = ficheAccess;
        this.referenceAccess = referenceAccess;
        this.profileDir = profileDir;
        this.ruleFilename = ruleFilename;
        gbl = new GridBagLayout();
        this.setLayout(gbl);
        this.addPanels();
        //this.addSearchFunctions();
        this.addTable();
        this.setBackground(Color.GREEN);
    }

    public void actionPerformed(ActionEvent e) {}

    private void addPanels() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        searchPanel = new JPanel();
        searchPanel.setBackground(Color.YELLOW);
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0.6;
        gbc.weighty = 0.2;
        gbl.setConstraints(searchPanel, gbc);
        this.add(searchPanel);

        tablePanel = new JPanel();
        tablePanel.setBackground(Color.CYAN);
        gbc.gridy = 1;
        gbc.weightx = 0.6;
        gbc.weighty = 0.6;
        gbl.setConstraints(tablePanel, gbc);
        this.add(tablePanel);

        listPanel = new JPanel();
        listPanel.setBackground(Color.BLACK);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.gridheight = 2;
        gbc.weightx = 0.2;
        gbc.weighty = 0.5;
        gbl.setConstraints(listPanel, gbc);
        this.add(listPanel);

        tableButtonPanel = new JPanel();
        tableButtonPanel.setBackground(Color.BLACK);
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.weightx = 0.6;
        gbc.weighty = 0.2;
        gbl.setConstraints(tableButtonPanel, gbc);
        this.add(tableButtonPanel);

        listButtonPanel = new JPanel();
        listButtonPanel.setBackground(Color.RED);
        gbc.gridx = 1;
        gbc.weightx = 0.2;
        gbc.weighty = 0.2;
        gbl.setConstraints(listButtonPanel, gbc);
        this.add(listButtonPanel);
    }

    private void addSearchFunctions() {
        GridBagLayout searchLayout = new GridBagLayout();
        GridBagConstraints searchConstraints = new GridBagConstraints();
        searchConstraints.fill = GridBagConstraints.BOTH;
        searchPanel.setLayout(searchLayout);

        JLabel fromLabel = new JLabel("From");
        JLabel toLabel = new JLabel("To");
        searchConstraints.gridx = 0;
        searchConstraints.gridy = 1;
        searchConstraints.insets = new Insets(0, 0, 5, 10);
        searchConstraints.weightx = 0.5;
        searchLayout.setConstraints(fromLabel, searchConstraints);
        searchPanel.add(fromLabel);
        searchConstraints.gridx = 1;
        searchLayout.setConstraints(toLabel, searchConstraints);
        searchPanel.add(toLabel);

        JTextField fromField = new JTextField();
        JTextField toField = new JTextField();
        searchConstraints.gridx = 0;
        searchConstraints.gridy = 2;
        searchConstraints.insets = new Insets(0, 0, 0, 10);
        searchLayout.setConstraints(fromField, searchConstraints);
        searchPanel.add(fromField);
        searchConstraints.gridx = 1;
        searchLayout.setConstraints(toField, searchConstraints);
        searchPanel.add(toField);

        JPanel radioButtonPanel = new JPanel();
        searchConstraints.gridx = 0;
        searchConstraints.gridy = 3;
        searchConstraints.gridwidth = 2;
        searchConstraints.weightx = 1.0;
        searchLayout.setConstraints(radioButtonPanel, searchConstraints);
        searchPanel.add(radioButtonPanel);
        
        JRadioButton exactButton = new JRadioButton("Exact");
        JRadioButton spanButton = new JRadioButton("Span");
        JRadioButton rangeButton = new JRadioButton("Range");
        FlowLayout flow = new FlowLayout(FlowLayout.LEADING);
        radioButtonPanel.setLayout(flow);
        radioButtonPanel.add(exactButton);
        radioButtonPanel.add(spanButton);
        radioButtonPanel.add(rangeButton);
    }

    private void addTable() {
        String[] columnNames = {
            "Entry", "Cross Reference", "Lexical Category", "Siglum",
            "Reference", "Definition", "Rest", "Database"
        };
        
        Object[][] dummy = {{"a","b","a","b","a","b","a","b"},{"a","b","a","b","a","b","a","b"}};
        JTable ficheTable = new JTable(dummy, columnNames);
        JScrollPane scrollPane = new JScrollPane(ficheTable);
        scrollPane.setBackground(Color.YELLOW);

        ficheTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        ficheTable.setFillsViewportHeight(true);

        tablePanel.setLayout(new BorderLayout());
        tablePanel.setBackground(Color.RED);
        tablePanel.add(scrollPane, BorderLayout.CENTER);
    }
}
 
Push :wink:

Nach etwas Herumprobieren scheint es so, dass es verschiedene Probleme gibt:

- die Spalten passen sich nicht der neuen Breite an
- das Layout hält sich nicht an die Vorgegebenen Verhältnisse (0.6 zu 0.3)
- das Layout verhält sich unterschiedlich, je nachdem ob ein Panel etwas enthält oder nicht, dann brauch ich nichts definieren, wenn alles für den A*sch ist

Was kann man da machen? Welcher Layout-Manager kann das besser?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben