2016-08-25 4 views
-1

Ich lese viel über dieses Problem hier ... Aber ich glaube nur nicht, wie man das löst. Alle Lösungen, die ich ausprobiert habe, funktionieren nicht.Ein weiterer GridBagLayout Alignment-Idiot

Aber fangen wir am Anfang an: Ich baue meine Schnittstelle mit Swing und versuche, modular zu sein. Also habe ich eine Klasse (Erweiterung JPanel) für mein linkes Hauptmenü. Das Menü besteht aus mehreren Schaltflächen in einem GridBagLayout.

Aber ich bin nicht in der Lage, diese Layyout auf den oberen Rand des Fensters (Panel) ausgerichtet zu bekommen. exampel: Label an der Spitze des Gremiums, Textfeld unten, Taste unter dem Textfeld usw.

bitte mein Code sehen:

public class LeftMenu extends JPanel { 
    public LeftMenu(){ 

    GridBagLayout gbl_panel = new GridBagLayout(); 
    gbl_panel.columnWidths = new int[] { 86, 0 }; 
    gbl_panel.rowHeights = new int[] {32, 32, 32, 32, 32, 32, 32, 32, 32 }; 
    gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE }; 
    gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 }; 
    setLayout(gbl_panel); 

    JLabel lblEnterTrunkId = new JLabel("Enter Trunk ID"); 
    GridBagConstraints gbc_lblEnterTrunkId = new GridBagConstraints(); 
    gbc_lblEnterTrunkId.fill = GridBagConstraints.HORIZONTAL; 
    gbc_lblEnterTrunkId.insets = new Insets(0, 0, 5, 0); 
    gbc_lblEnterTrunkId.gridx = 0; 
    gbc_lblEnterTrunkId.gridy = 0; 
    gbc_lblEnterTrunkId.anchor = GridBagConstraints.NORTH; 
    add(lblEnterTrunkId, gbc_lblEnterTrunkId); 
    } 
} 

Es ist ein Textfeld und einige Tasten folgende hinter der Etikette. Aber ich nehme an, diese sind nicht relevant ... Wenn sie ... sie sind meistens wie das Etikett (nur, dass sie nicht Etiketten sind ... Ich glaube, Sie bekommen mich)

Alle Anleitungen, die ich lese , zeigen alle auf den Anker der GridBagConstraint. Es ist da .... aber nicht funktioniert. Es ist wunderbar in der Mitte des Panels ausgerichtet.

Wenn es nicht egal: das Gremium ist als LeftComponent eines SplitPane verwendet:

public LeftMenu leftpanel = new LeftMenu(); 

splitPaneTrunks.setLeftComponent(leftpanel); 

Wir freuen uns auf Ihre Hilfe.

Hier ist ein Bild von meinem Seitenmenü ... horizontal zentriert. wie es nicht sein sollte.

http://i.stack.imgur.com/NsBg2.png

+0

1) Für eine bessere Hilfe früher, Posten [MCVE] oder [Kurz, Self Contained, Korrekt Beispiel] (http://www.sscce.org/). 2) Bereitstellung von ASCII-Grafiken oder einer einfachen Zeichnung des * beabsichtigten * Layouts der GUI bei minimaler Größe und wenn sie in der Größe veränderbar ist, mit mehr Breite und Höhe. –

+0

zeige HorizontalLayout in Swingx-Bibliothek –

Antwort

1

Statt GridBagLayout zu verwenden, können Sie einen Wrap machen ein JPanel mit dem Layout mit BorderLayout, etwa so:

setLayout(new BorderLayout()); 

    JPanel gridBagWrap = new JPanel(); 

    GridBagLayout gbl_panel = new GridBagLayout(); 
    gbl_panel.columnWidths = new int[] { 86, 0 }; 
    gbl_panel.rowHeights = new int[] {32, 32, 32, 32, 32, 32, 32, 32, 32 }; 
    gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE }; 
    gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 }; 
    gridBagWrap.setLayout(gbl_panel); 

    JLabel lblEnterTrunkId = new JLabel("Enter Trunk ID"); 
    GridBagConstraints gbc_lblEnterTrunkId = new GridBagConstraints(); 
    gbc_lblEnterTrunkId.fill = GridBagConstraints.HORIZONTAL; 
    gbc_lblEnterTrunkId.insets = new Insets(0, 0, 5, 0); 
    gbc_lblEnterTrunkId.gridx = 0; 
    gbc_lblEnterTrunkId.gridy = 0; 
    gbc_lblEnterTrunkId.anchor = GridBagConstraints.NORTH; 
    gridBagWrap.add(lblEnterTrunkId, gbc_lblEnterTrunkId); 

    add(gridBagWrap, BorderLayout.NORTH); 
+0

Danke für die Antwort ... scheint, beschrieb ich ein bisschen falsch, was ich brauche ... meinen Text bearbeitet. Tut mir leid. Ich möchte die Objekte nicht am oberen Rand der Seite ausrichten. Die gesamte Gittertasche sollte oben ausgerichtet sein. Alle Elemente in der Gittersacktasche werden genau so positioniert, wie ich es brauche ... aber das erste Objekt befindet sich nicht an der Spitze des JPanels. – Marcus

+0

@Marcus können Sie einen Screenshot hochladen? – nyxaria

+0

Nur war es ... war mir nicht bewusst, dass es hier so einfach hinzugefügt werden konnte. – Marcus

1

hier ist ein Bild von meiner Seite im Menü ... horizontal zentriert. wie es nicht sein sollte.

Ich denke, Sie meinen, es sollte nicht vertikal zentriert werden, wenn Sie die Komponenten von oben angezeigt werden möchten.

In jedem Fall denke ich, das Problem ist Ihre weighty Einschränkung. Sie muss für mindestens eine der Komponenten nicht null sein, da andernfalls die Komponenten vertikal zentriert sind.

Lesen Sie den Abschnitt aus dem Swing-Tutorial auf How to Use GridBagLayout. Es gibt einen Abschnitt über die gewichtsbezogenen/gewichtigen Einschränkungen, der dies genauer erklären wird.

0

Es ist keine Überraschung, dass Sie mit GridBagLayout Manager verloren sind. Es ist in der Tat eines der am häufigsten genannten Merkmale. GridBagLayout stammt aus den neunziger Jahren und verwendet Pixel-feste Lücken zwischen Komponenten, die nicht tragbar ist. Mit diesem Manager müssen Sie mühsam jede Zelle des Layouts definieren; Kein Wunder, dass die Leute verwirrt sind.

Ich empfehle, MigLayout zu verwenden. Und wenn es nicht verwendet werden kann, dann GroupLayout.

Hier ist eine Lösung mit MigLayout:

package com.zetcode; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import net.miginfocom.swing.MigLayout; 

/* 
Demonstration of MigLayout manager. 
Author: Jan Bodnar 
Website: zetcode.com 
*/ 
public class MigLayoutTrunkEx extends JFrame { 

    public MigLayoutTrunkEx() { 

     initUI(); 
    } 

    private void initUI() { 

     JLabel lbl = new JLabel("Enter Trunk ID"); 
     JTextField textField = new JTextField(10); 

     JButton btn1 = new JButton("A"); 
     JButton btn2 = new JButton("B"); 
     JButton btn3 = new JButton("C"); 
     JButton btn4 = new JButton("D"); 
     JButton btn5 = new JButton("E"); 

     JTextArea area = new JTextArea(20, 25); 
     area.setBorder(BorderFactory.createEtchedBorder()); 

     JLabel statusBar = new JLabel("Ready"); 

     createLayout(lbl, textField, btn1, btn2, btn3, 
       btn4, btn5, area, statusBar); 

     setTitle("MigLayout example"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 

     setLayout(new MigLayout("", "[align center]", "")); 

     add(arg[0], "split 7, flowy"); 
     add(arg[1]); 
     add(arg[2]); 
     add(arg[3]); 
     add(arg[4]); 
     add(arg[5]); 
     add(arg[6]); 
     add(arg[7], "grow, push, wrap"); 
     add(arg[8], "align left, growx, spanx"); 

     pack(); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> { 
      MigLayoutTrunkEx ex = new MigLayoutTrunkEx(); 
      ex.setVisible(true); 
     }); 
    } 
} 

Es ist einfach, wenn Sie MigLayout kennen zu lernen. Zehn oder fünfzehn Minuten Arbeit.

Screenshot:

MigLayout example screenshot