2016-08-25 3 views
-1

Я много читал об этой проблеме здесь ... Но я просто не понимаю, как это решить. Все решения, которые я пробовал, не работают.Другое GridBagLayout Alignment idiot

Но начнем с самого начала: Я строю свой интерфейс с Swing и пытаюсь быть модульным. Итак, у меня есть класс (расширение JPanel) для моего главного меню. Меню ist build с несколькими кнопками в GridBagLayout.

Но я не могу заставить это layyout выравниваться в верхней части окна (панели). Примеру: Этикетка на верхней части панели, ниже текстовое поле, кнопка под текстовым полем и т.д.

смотрите мой код:

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); 
    } 
} 

Существует текстовое поле и некоторые следующие кнопки позади Метка. Но я предполагаю, что это не имеет значения ... Если они ... они в основном похожи на ярлык (просто они не являются ярлыками ... Я думаю, что вы меня достали)

Все руководства, которые я читаю , все указывают на якорь GridBagConstraint. Он там ... но не работает. Великолепно выравнивается в середине панели.

Если это имеет значение: Группа ИСТ используется в качестве LeftComponent из в SplitPane:

public LeftMenu leftpanel = new LeftMenu(); 

splitPaneTrunks.setLeftComponent(leftpanel); 

Ждем вашей помощи.

вот фотография моего бокового меню ... по горизонтали. как этого и не должно быть.

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

+0

1) Для лучшей помощи раньше, опубликовать [MCVE] или [Короткий, самодостаточный Правильный пример] (http://www.sscce.org/). 2) Обеспечить ASCII-искусство или простой рисунок * предназначенного макета GUI при минимальном размере и, если он изменен, с большей шириной и высотой. –

+0

показать HorizontalLayout в библиотеке swingx –

ответ

1

Вместо использования GridBagLayout, вы могли бы сделать обертывание с использованием JPanel с макетом BorderLayout, например, так:

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

Спасибо за ответ ... кажется, я описал немного неправильно, что мне нужно ... отредактировал мой текст. Извини за это. Я не хочу выравнивать объекты в верхней части страницы. Весь сетчатый мешок должен располагаться вверху. Все элементы в сетчатой ​​сумке расположены тонера точно так, как мне нужно ... но первый объект не находится на вершине JPanel. – Marcus

+0

@Marcus можете опубликовать снимок экрана? – nyxaria

+0

Просто сделал это ... не знал, что его можно добавить сюда так легко. – Marcus

1

здесь фотография моего бокового меню ... по горизонтали. как этого и не должно быть.

Я думаю, вы имеете в виду, что он не должен быть центрирован по вертикали, если вы хотите, чтобы компоненты отображались сверху.

В любом случае, я думаю, что проблема заключается в вашем ограничении weighty. Он должен быть отличным от нуля для хотя бы одного из компонентов, иначе компоненты будут центрироваться по вертикали.

Прочтите раздел из учебника Swing по телефону How to Use GridBagLayout. Существует раздел о весовых/весовых ограничениях, которые объяснят это более подробно.

0

Нет ничего удивительного в том, что вы потерялись с менеджером GridBagLayout. Это на самом деле одна из наиболее часто упоминаемых особенностей. GridBagLayout происходит с девяностых и использует пиксельные фиксированные промежутки между компонентами, которые не являются переносимыми. С этим менеджером вам нужно утомительно определить каждую ячейку макета; неудивительно, что люди смущены.

Я рекомендую использовать MigLayout. И если он не может быть использован, то GroupLayout.

Вот решение с 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); 
     }); 
    } 
} 

Это легко, как только вы получите знать MigLayout. Десять или пятнадцать минут работы.

Скриншот:

MigLayout example screenshot