Swing Seltsames Verhalten GridBagLayout

HarleyDavidson

Bekanntes Mitglied
Hallo zusammen,

ich kämpfe gerade mit einer GUI und dem GridBadLayout, dass nicht so will wie ich es will.
Um folgende GUI geht es:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.WindowEvent;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;

/**
 *
 * @author Dominik Sust
 * @creation 01.10.2014 11:50:50
 */
public class Form_Auswahl_New extends JFrame
{

    //Schriftarten
    private final java.awt.Font font_projektListe = new java.awt.Font( "Tahoma", Font.BOLD, 13 );
    private final java.awt.Font font_LabelUeberschrift = new java.awt.Font( "Tahoma", Font.BOLD, 14 );
    private final java.awt.Font font_buttons_gross = new java.awt.Font( "Tahoma", Font.BOLD, 18 );

    //Komponenten
    private javax.swing.JPanel conentPane;
    private javax.swing.JButton jButton_Nacharbeit_Korrektur;
    private javax.swing.JButton jButton_Nacharbeit_Nacharbeit;
    private javax.swing.JLabel jLabel_Schritt1;
    private javax.swing.JLabel jLabel_Schritt2;
    private javax.swing.JPanel jPanel_Nacharbeit;
    private javax.swing.JPanel jPanel_Sonstiges;
    private javax.swing.JScrollPane jScrollPane_Projektliste;
    private javax.swing.JTree jTree_Projekte;

    public Form_Auswahl_New()
    {
        initComponents();
        this.setVisible( true );
    }

    public static void main( String[] args ) throws Exception
    {
        // Look and Feel setzen
        UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
        new Form_Auswahl_New();
    }

    private void initComponents()
    {
        //Frame allgemein
        this.setSize( 650, 736 );
        this.setLocationRelativeTo( null );
        this.setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE );
        this.setFocusCycleRoot( false );
        this.setResizable( false );
        conentPane = new javax.swing.JPanel();
        conentPane.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
        this.setContentPane( conentPane );

        //Komponenten initialisieren
        jPanel_Nacharbeit = new javax.swing.JPanel();
        jTree_Projekte = new javax.swing.JTree();
        jScrollPane_Projektliste = new javax.swing.JScrollPane( jTree_Projekte );
        jButton_Nacharbeit_Nacharbeit = new javax.swing.JButton();
        jButton_Nacharbeit_Korrektur = new javax.swing.JButton();
        jLabel_Schritt2 = new javax.swing.JLabel();
        jLabel_Schritt1 = new javax.swing.JLabel();
        jPanel_Sonstiges = new javax.swing.JPanel();

        //Panel Projekt auswählen initialisieren
        jPanel_Nacharbeit.setBorder( javax.swing.BorderFactory.createTitledBorder( "Projekt auswählen" ) );
        jPanel_Nacharbeit.setLayout( new GridBagLayout() );
        GridBagConstraints c = new GridBagConstraints();
        jPanel_Nacharbeit.setPreferredSize( new Dimension( 370, 660 ) );
        this.add( jPanel_Nacharbeit, BorderLayout.WEST );

        //Überschrift
        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 2;
        jLabel_Schritt1.setFont( font_LabelUeberschrift );
        jLabel_Schritt1.setText( "1. Schritt: Belegart wählen" );
        jPanel_Nacharbeit.add( jLabel_Schritt1, c );

        //ProjektListe
        jTree_Projekte.setFont( font_projektListe );
        jTree_Projekte.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 2;
        jPanel_Nacharbeit.add( jScrollPane_Projektliste, c );

        //jTree_Projekte.setModel( projektBaumErstellen() );
        //Baum öffnen
        for ( int i = 0; i < jTree_Projekte.getRowCount(); i++ )
        {
            jTree_Projekte.expandRow( i );
        }

        //Nacharbeit / Korrektur wählen
        jLabel_Schritt2.setFont( font_LabelUeberschrift );
        jLabel_Schritt2.setText( "2. Schritt: Nacharbeit / Korrektur wählen" );
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 2;
        jPanel_Nacharbeit.add( jLabel_Schritt2 );

        jButton_Nacharbeit_Nacharbeit.setText( "Nacharbeit..." );
        jButton_Nacharbeit_Nacharbeit.setFont( font_buttons_gross );
        jButton_Nacharbeit_Nacharbeit.setSize( 170, 31 );
        c.gridx = 1;
        c.gridy = 4;
        c.gridwidth = 1;
        jPanel_Nacharbeit.add( jButton_Nacharbeit_Nacharbeit, c );

        jButton_Nacharbeit_Korrektur.setText( "Korrektur..." );
        jButton_Nacharbeit_Korrektur.setFont( font_buttons_gross );
        jButton_Nacharbeit_Korrektur.setSize( 170, 31 );
        c.gridx = 2;
        c.gridy = 4;
        c.gridwidth = 1;
        jPanel_Nacharbeit.add( jButton_Nacharbeit_Korrektur, c );

        //Panel Sonstiges initialisieren
        jPanel_Sonstiges.setBorder( javax.swing.BorderFactory.createTitledBorder( "Sonstiges" ) );
        jPanel_Nacharbeit.setLayout( new BoxLayout( jPanel_Nacharbeit, BoxLayout.Y_AXIS ) );
        jPanel_Sonstiges.setPreferredSize( new Dimension( 250, 660 ) );
        this.add( jPanel_Sonstiges, BorderLayout.EAST );

    }
}

Die zwei Buttons unten sollen in eine Reihe, das gebe ich ja auch per GridBagConstraints so an.
Aber trotzdem sind die immer untereinander. Warum? Was mache ich falsch?

Über schnelle Hilfe würde ich mich freuen!

Vielen Dank für eure Hilfe!
 
Kein seltsames Verhalten, du hast einfach einen Fehler drinnen.

In Zeile 77 setzt du ein GridBagLayout deinem Panel und in Zeile 131 ein BoxLayout mit y Ausrichtung.

Lösung wäre ein normales BoxLayout wie in Zeile 131 zu verwenden und die Buttons in ein eigenes Panel zu stecken, das wiederum ein FlowLayout besitzt.
 
Vielen Dank! Die Buttons sind nun schön nebeneinander.

Nächstes Problem: Das wrapper-Panel ist viel zu hoch und die Labels sind nun nicht mehr linksbündig...

Java:
        JPanel wrapper = new JPanel( new FlowLayout(FlowLayout.LEFT));

        jButton_Nacharbeit_Nacharbeit.setText( "Nacharbeit..." );
        jButton_Nacharbeit_Nacharbeit.setFont( font_buttons_gross );
        //jButton_Nacharbeit_Nacharbeit.setSize( new Dimension( 170, 31 ) );
        wrapper.add( jButton_Nacharbeit_Nacharbeit );

        jButton_Nacharbeit_Korrektur.setText( "Korrektur..." );
        jButton_Nacharbeit_Korrektur.setFont( font_buttons_gross );
        //jButton_Nacharbeit_Korrektur.setSize( new Dimension( 170, 31 ) );
        wrapper.add( jButton_Nacharbeit_Korrektur );

        jPanel_Nacharbeit.add( wrapper );
 
Von Hand ausprogrammiert.

Update: Das mit der Höhe des Panels hab ich nun hinbekommen:

Java:
wrapper.setMaximumSize( new Dimension(600, 10));

Nun sind aber die Labels verschoben! Die sollten linksbündig sein, so wie sie auch waren bevor ich das wrapper-Panel implementiert habe... ;( Damn!

Siehe Bild. Woran liegt das schon wieder?
 

Anhänge

  • 2014-10-02 15_59_17-.jpg
    2014-10-02 15_59_17-.jpg
    24,6 KB · Aufrufe: 24
Zuletzt bearbeitet:
du meinst das Label
Code:
2. Schritt : Korrektur/Nacharbeit..
?

poste doch mal das snippet in welchem du die das label addest
 
Zuletzt bearbeitet:
Wieder bin ich etwas weiter!
Auf der Seite How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

steht folgendes:

In general, all the components controlled by a top-to-bottom BoxLayout object should have the same X alignment. Similarly, all the components controlled by a left-to-right Boxlayout should generally have the same Y alignment. You can set a JComponent's X alignment by invoking its setAlignmentX method. An alternative available to all components is to override the getAlignmentX method in a custom subclass of the component class. Similarly, you set the Y alignment of a component by invoking the setAlignmentY method or by overriding getAlignmentY.

Ein JPanel hat standardmäßig eine zentrale Ausrichtung. Ich habe die nun auf links umgestellt und alles sieht super aus! 🙂

Warum das wrapper-Panel allerdings so hoch wird wenn ich "setMaximumSize" nicht setze bleibt mir ein Rätsel.

Java:
        JPanel wrapper = new JPanel( new FlowLayout(FlowLayout.LEFT));
        wrapper.setAlignmentX( Component.LEFT_ALIGNMENT);
        wrapper.setMaximumSize( new Dimension(660, 10));

        jButton_Nacharbeit_Nacharbeit.setText( "Nacharbeit..." );
        jButton_Nacharbeit_Nacharbeit.setFont( font_buttons_gross );
        //jButton_Nacharbeit_Nacharbeit.setSize( new Dimension( 170, 31 ) );
        wrapper.add( jButton_Nacharbeit_Nacharbeit );

        jButton_Nacharbeit_Korrektur.setText( "Korrektur..." );
        jButton_Nacharbeit_Korrektur.setFont( font_buttons_gross );
        //jButton_Nacharbeit_Korrektur.setSize( new Dimension( 170, 31 ) );
        wrapper.add( jButton_Nacharbeit_Korrektur );

        jPanel_Nacharbeit.add( wrapper );

Das Bild im Anhang zeigt die GUI, wenn ich setMaximumSize auskommentiere...
 

Anhänge

  • 2014-10-02 16_18_07-JavaNacharbeit - NetBeans IDE 8.0.1.jpg
    2014-10-02 16_18_07-JavaNacharbeit - NetBeans IDE 8.0.1.jpg
    34,2 KB · Aufrufe: 26
Nein, ein BoxLayout.

Java:
        jPanel_Nacharbeit.setLayout( new BoxLayout( jPanel_Nacharbeit, BoxLayout.Y_AXIS ) );
        jPanel_Nacharbeit.setPreferredSize( new Dimension( 370, 660 ) );
 
also wird dein wrapper auf die maximale göße des ihn umgebenen Containers gestretcht ...
jPanel_Nacharbeit.setPreferredSize( new Dimension( 370, 660

um das eben schnell nachzuvollziehen
Code:
Container (BoxLayout) 370, 660
  |
    Wrapper(Flowlayout) nimmt den maximal verfügbaren platz ein

ausser wenn du eine Maximal größe setzt.

ich schau mal eben fix moment , das problem hatte ich glaube ich auch schonmal
 
Zuletzt bearbeitet:
Java:
public class Foo extends JPanel{

	
	public Foo(){
		setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
		setPreferredSize(new Dimension(370,660));
		add(Box.createVerticalGlue());
		add(createWrapper());
	}
	
	public JPanel createWrapper(){
		JPanel panel = new JPanel();
		panel.setMaximumSize(new Dimension(370,100));
		panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
		panel.add(new JButton("balbla"));
		panel.add(new JButton("sdfsdf"));
		return panel;
	}
	
	
	public static void main(String[] args){
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(2);
		f.setContentPane(new Foo());
		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}

Du scheinst hier wohl tatsächlich mit panel.setMaximumSize(new Dimension(370,100));
arbeiten zu müssen wenn die darüberliegenden Komponenten nicht den restlichen verfügbaren platz einnehmen sollten .
 

Zurück
Oben