Swing Problem mit Gridbaglayout bzw. Größenanpassung JPanels

Hallo,
ich habe folgendes Problem.

Ich habe eine Gui mittels Borderlayout in 3 Bereiche unterteilt.

Java:
		this.setLayout(new BorderLayout());
		this.add(panelLeft, BorderLayout.WEST);
		this.add(panelMiddle, BorderLayout.CENTER);
		this.add(panelSouth, BorderLayout.SOUTH);

Das Problem ist mit dem linken Bereich.. Dieser soll einen JTree,ein JTable und ein Button beinhalten.
Ich dachte mir, dass man dies mittels dem Gridbaglayout lösen kann. Dies geht auch, jedoch ist die Darstellung nicht so, wie ich es mir wünsche.. 🙁

Also habe ich für den linken Panel eine neue Klasse gemacht, das für die Verwaltung des Gridbaglayouts dient.

Java:
 public class LeftPanel extends JPanel {
...
setLayout(new GridBagLayout());
		GridBagConstraints cTree = new GridBagConstraints();
		GridBagConstraints cTable = new GridBagConstraints();

		cTree.gridx = 1;
		cTree.gridy = 1;
		cTree.anchor = GridBagConstraints.FIRST_LINE_START;
		add((Baum), cTree);

		cTable.gridx = 1;
		cTable.gridy = 2;
		cTable.weightx = 1;
		add((Parameter), cTable);
}

Der JTree ist in dieser Klasse...:

Java:
public class Baum extends JPanel {
	
	public Baum(){
	// Der Wurzelknoten wird hergestellt
        TreeNode root = createTree(); 
        
        // Der Wurzelknoten wird dem neuen JTree im Konstruktor übergeben
        JTree tree = new JTree( root );
       
        // Wurzel ist unsichtbar
        tree.setRootVisible(false);

        // Scrollbalken wird erstellt und der Baum drin eingebettet
        this.add( new JScrollPane( tree )); 

        this.setMinimumSize( new Dimension (300,400) );

    }
...

Bei der Klasse für den JTable wurde ähnlich verfahren.

So sieht es momentan aus:
attachment.php


Ich würde aber gerne den kompletten linken Bereich verkleinern, auf die Größe des JTables. Wenn ich im Border Layout dies über preferredSize mache, zerstört es den Inhalt, aber nur..

Also folgende Fragen:

Wie kriege ich es hin, dass der linke Bereich des Borderlayouts der Größe des JTables angepasst wird?

Wie kriege ich es hin, dass der JTree den kompletten Inhalts des JPanels einnimmt und nicht mittig? ist.

Vielen Dank für das Beantworten meiner Fragen!!! Und vielen Dank an jeden, der sich für mein Problem Zeit nimmt!!! 🙂

Gruß
 

Anhänge

  • zwischenablage01oor3.jpg
    zwischenablage01oor3.jpg
    55,6 KB · Aufrufe: 63
Zuletzt bearbeitet:
Java:
GridBagConstraints cTree = new GridBagConstraints();
GridBagConstraints cTable = new GridBagConstraints();
 
cTree.gridx = 0;
cTree.gridy = 0;
cTree.gridwidth = 1;
cTree.gridheight = 1;
cTree.fill = GridBagConstraints.BOTH;
cTree.anchor = GridBagConstraints.FIRST_LINE_START;
add((Baum), cTree);
 
cTable.gridx = 0;
cTable.gridy = 1;
cTable.gridwidth = 1;
cTable.gridheight = 1;
cTable.fill = GridBagConstraints.BOTH;
cTable.weightx = 1;
add((Parameter), cTable);
.. bringt auch keine Veränderungen?
 
Nope, keine Veränderung..

Mit den Möglichkeiten fürs GridbagLayout habe ich mich herumgespielt, es ändert sich jedoch nicht in etwas brauchbares..

Ich denke, dass man an dieser Stelle nichts erreichen kann, sondern bei den beiden panels was bearbeiten muss...

Nur was genau, weiß ich noch nicht.. 🙁

Ich füge mal den Code für das untere JPanel bei..

Java:
public class ParameterTable extends JPanel{

	private static final long serialVersionUID = 1L;
	
	public ParameterTable() {
	      // Unser TableModel
	      ParameterModel parameterModel= new ParameterModel(); // befindet sich ausgelagert im Package Model
	      
	      // Das JTable initialisieren
	      JTable table = new JTable( parameterModel );
	      this.setMinimumSize( new Dimension (500,200) );
	      //Der Benutzer darf keine Spalten vertauschen
	      table.getTableHeader().setReorderingAllowed( false ); 
	      
	      //Automatische Größenanpassung deaktivieren
	      table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
	      
	      //Die beiden Spalten erhalten ihre feste Größe
	      table.getColumnModel().getColumn( 0 ).setPreferredWidth( 150 );
	      table.getColumnModel().getColumn( 1 ).setPreferredWidth( 200 );
	      
          //Scrollen ermöglichen und einbetten
	      this.add( new JScrollPane( table ) );
	   }
}
 
Hallo DefenderDeLuXe,

meinst du so:

Java:
import java.awt.*;
import static java.awt.GridBagConstraints.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.tree.*;

public class GBLDemo extends JFrame {

    private final JPanel panelLeft, panelMiddle, panelSouth;

    public GBLDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(700, 550);
        setLocationRelativeTo(null);
        this.setLayout(new BorderLayout());
        panelLeft = new LeftPanel();
        panelMiddle = new JPanel();
        panelMiddle.setBackground(Color.lightGray);
        panelMiddle.setPreferredSize(new Dimension(300, 300));
        panelSouth = new JPanel();
        panelSouth.setBackground(Color.gray);
        panelSouth.setPreferredSize(new Dimension(300, 30));
        this.add(panelLeft, BorderLayout.WEST);
        this.add(panelMiddle, BorderLayout.CENTER);
        this.add(panelSouth, BorderLayout.SOUTH);
    }

    public static void main(final String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new GBLDemo().setVisible(true);
            }
        });
    }
}

class LeftPanel extends JPanel {

    public LeftPanel() {
        setLayout(new GridBagLayout());
        GridBagConstraints cTree = new GridBagConstraints();
        GridBagConstraints cTable = new GridBagConstraints();
        GridBagConstraints cButton = new GridBagConstraints();

        cTree.gridx = 1;
        cTree.gridy = 1;
        cTree.fill = BOTH;
        cTree.weighty = 1.0;
        add(new Baum(), cTree);

        cTable.gridx = 1;
        cTable.gridy = 2;
        cTable.weightx = 1.0;
        cTable.weighty = 0.5;
        add(new ParameterTable(), cTable);

        cButton.gridx = 1;
        cButton.gridy = 3;
        cButton.anchor = LINE_END;
        cButton.insets = new Insets(5, 5, 5, 5);
        add(new JButton("OK"), cButton);
    }
}

class Baum extends JPanel {

    public Baum() {
        setLayout(new BorderLayout());
        // Der Wurzelknoten wird hergestellt
        TreeNode root = createTree();
        // Der Wurzelknoten wird dem neuen JTree im Konstruktor übergeben
        JTree tree = new JTree(root);
        // Wurzel ist unsichtbar
        tree.setRootVisible(false);
        // Scrollbalken wird erstellt und der Baum drin eingebettet
        this.add(new JScrollPane(tree));
        this.setMinimumSize(new Dimension(300, 400));
        this.setPreferredSize(getMinimumSize());
    }

    private TreeNode createTree() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
        DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("node1");
        DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("node2");
        DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("node3");
        DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("node4");
        root.add(node1);
        root.add(node2);
        root.add(node3);
        root.add(node4);
        return root;
    }
}

class ParameterTable extends JPanel {

    private static final long serialVersionUID = 1L;

    public ParameterTable() {
        setLayout(new BorderLayout());
        // Unser TableModel
        ParameterModel parameterModel = new ParameterModel();
        // Das JTable initialisieren
        JTable table = new JTable(parameterModel);
        this.setMinimumSize(new Dimension(360, 200));
        this.setPreferredSize(getMinimumSize());
        //Der Benutzer darf keine Spalten vertauschen
        table.getTableHeader().setReorderingAllowed(false);
        //Automatische Größenanpassung deaktivieren
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        //Die beiden Spalten erhalten ihre feste Größe
        table.getColumnModel().getColumn(0).setPreferredWidth(150);
        table.getColumnModel().getColumn(1).setPreferredWidth(200);
        //Scrollen ermöglichen und einbetten
        this.add(new JScrollPane(table));
    }
}

class ParameterModel extends DefaultTableModel {

    ParameterModel() {
        super(5, 2);
    }
}

?

Gruß,
André
 

Anhänge

  • gbldemo.png
    gbldemo.png
    12,2 KB · Aufrufe: 35
Zuletzt bearbeitet:
Kommentier' die setMinimumSize-Anweisung mal aus bzw. verringere den x-Wert.

Die habe ich gebraucht, damit in der Auflösung von 1024x768 die Sachen richtig angezeigt werden...

@André Uhres

Ja genau sowas habe ich gemeint!!! Vielen Dank. Ich versuche jetzt in meinem Code das anzuwenden, schreib danach die Veränderungen und Gedankengänge nieder und tu danach falls alles klappt, den Thread als erledigt markieren.. Danke. 🙂

edit.
Habe jetzt alles verstanden.. 🙂

Java:
setLayout(new BorderLayout());
hatte man gebraucht, damit der JTree bzw. das JTable nicht "lose" drin ist im JPanel, sondern seinen "festen" Platz hat

Java:
this.setPreferredSize(getMinimumSize());
hatte man gebraucht, damit die Minimum Größe auch angenommen wird.

Die zusätzlichen Sachen beim GridbagLayout hatte man zur richtigen Anordnung gebraucht, was jetzt auch wunderbar funktioniert hat.

danke nochmal 🙂
Als erledigt markiert.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben