Java Swing Layout не делает то, что я пытаюсь - PullRequest
3 голосов
/ 13 декабря 2011

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

 |label|  [combo box]
 |label|  [txtfield]
 |label|  [txtfield]
 |  long label here |


 [btn1]      [btn2]

Я пытаюсь использовать GridBagLayout, он не делает то, что я хочу, и я не уверен, что понимаю, почему,По сути, я хочу, чтобы кнопки были прикреплены к нижней части диалогового окна.

Код ниже показывает, как я его использую:

package gui;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class GridBagLayoutExample2 extends JFrame {

    private static final long serialVersionUID = -1972347726217162551L;
    final private JLabel lbl1 = new JLabel("LABEL1: ");
    final private JLabel lbl2 = new JLabel("LABEL2: ");
    final private JLabel lbl3 = new JLabel("LABEL3: ");
    final private JTextArea txt1 = new JTextArea(" ");
    final private JComboBox cmb1 = new JComboBox();
    final private JTextArea txt2 = new JTextArea("");
    final private JLabel lblLine = new JLabel("a compenent on all the line");
    final private JButton btnOK = new JButton("OK");
    final private JButton btnCancel = new JButton("Cancel");

    public GridBagLayoutExample2() {

        GridBagLayout bl = new GridBagLayout();
        Container pane = getContentPane();
        pane.setLayout(bl);
        GridBagConstraints c = new GridBagConstraints();
        int r = 0;

        placeComponentInGridBagLayout(lbl1, pane, bl, c, 0, r, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(cmb1, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(lbl2, pane, bl, c, 0, r, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(txt2, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(lbl3, pane, bl, c, 0, r, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(txt1, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(lblLine, pane, bl, c, 0, r++, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 2, null, null, null);
        placeComponentInGridBagLayout(btnOK, pane, bl, c, 0, null, null, null, GridBagConstraints.PAGE_END, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(btnCancel, pane, bl, c, 1, null, null, null, GridBagConstraints.PAGE_END, GridBagConstraints.HORIZONTAL, null, null, null, null);

        setSize(new Dimension(850, 350));
        pack();
        setVisible(true);
    }

    public static void placeComponentInGridBagLayout(Component component, Container container, GridBagLayout bagLayout, GridBagConstraints c, Integer gridX, Integer gridY, Double weightX, Double weightY, Integer anchor, Integer fill, Integer ipadx, Integer ipady,
            Integer gridWidth, Integer gridHeight) {
        if (c == null) {
            c = new GridBagConstraints();
        }
        if (gridX != null) {
            c.gridx = gridX;
        }
        if (gridY != null) {
            c.gridy = gridY;
        }
        if (weightX != null) {
            c.weightx = weightX;
        }
        if (weightY != null) {
            c.weighty = weightY;
        }
        if (fill != null) {
            c.fill = fill;
        }
        if (anchor != null) {
            c.anchor = anchor;
        }
        if (ipadx != null) {
            c.ipadx = ipadx;
        }
        if (ipady != null) {
            c.ipady = ipady;
        }
        if (gridWidth != null) {
            c.gridwidth = gridWidth;
        }
        if (gridHeight != null) {
            c.gridheight = gridHeight;
        }
        bagLayout.setConstraints(component, c);

        container.add(component);
    }

}

Есть идеи, что я делаю неправильно?Также есть ли более современный способ достижения того же самого в Swing?

спасибо

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Хороший LayoutManager для этих целей - FormLayout от JGoodies.

2 голосов
/ 13 декабря 2011

При выполнении простой формы SpringLayout является полезным менеджером макета.А для упаковки компонентов в линию полезно использовать BoxLayout .

Вот краткий пример:

enter image description here

А воткод:

public class LayoutDemo extends JFrame {

    public LayoutDemo() {

        JLabel label1 = new JLabel("label 1");
        JLabel label2 = new JLabel("label 2");
        JLabel label3 = new JLabel("label 3");
        JComboBox<String> combobox = new JComboBox<>();
        JTextField field1 = new JTextField();
        JTextField field2 = new JTextField();

        JPanel formPanel = new JPanel(new SpringLayout());
        formPanel.add(label1);
        formPanel.add(combobox);
        formPanel.add(label2);
        formPanel.add(field1);
        formPanel.add(label3);
        formPanel.add(field2);

        SpringUtilities.makeCompactGrid(formPanel, 3, 2, 2, 2, 3, 3);

        JLabel longLabel = new JLabel("This is a longer label");
        longLabel.setAlignmentX(CENTER_ALIGNMENT);

        JButton button1 = new JButton("Button 1");
        JButton button2 = new JButton("Button 2");

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
        buttonPanel.add(button1);
        buttonPanel.add(Box.createHorizontalGlue());
        buttonPanel.add(button2);

        JPanel basePanel = new JPanel();
        basePanel.setLayout(new BoxLayout(basePanel, BoxLayout.PAGE_AXIS));
        basePanel.add(formPanel);
        basePanel.add(longLabel);

        add(basePanel, BorderLayout.NORTH);
        add(buttonPanel, BorderLayout.SOUTH);
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new LayoutDemo();
    }
}

Вы можете использовать BorderLayout , чтобы, например, удерживать formPanel сверху без растяжения при изменении размера окна.Но я надеюсь, что дал вам несколько идей о том, как использовать SpringLayout для форм.

2 голосов
/ 13 декабря 2011

Вы можете использовать комбинацию borderlayout и gridlayout, как показано ниже

enter image description here

package sof;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CustomLayoutFrame{
    public static void main(String args[]) {
        JFrame frame = new JFrame("Custom Layout Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        JPanel centerPnl = new JPanel();
        centerPnl.setLayout(new BorderLayout());
        JPanel gridLayoutPane = new JPanel(); 
        GridLayout gridLayout = new GridLayout(3,2);
        gridLayoutPane.setLayout(gridLayout);
        gridLayoutPane.add(new JLabel("Label1"));
        gridLayoutPane.add(new JComboBox());
        gridLayoutPane.add(new JLabel("Label2"));
        gridLayoutPane.add(new JTextField());
        gridLayoutPane.add(new JLabel("Label3"));
        gridLayoutPane.add(new JTextField());
        centerPnl.add(gridLayoutPane, BorderLayout.CENTER);
        centerPnl.add(new JLabel("Long label should be going here"), BorderLayout.SOUTH);

        frame.add(centerPnl, BorderLayout.CENTER);

        JPanel bottomPanel = new JPanel();
        bottomPanel.add(new JButton("Button1"));
        bottomPanel.add(new JButton("Button2"));

        frame.add(bottomPanel, BorderLayout.SOUTH);

        frame.setSize(300, 150);
        frame.setVisible(true);
      }
}
2 голосов
/ 13 декабря 2011

Одна проблема, которую я вижу, состоит в том, что ваша длинная метка находится в той же ячейке сетки, что и ваша кнопка ОК.Если вы хотите закрепить кнопки в нижней части всего диалога, попробуйте использовать BorderLayout.Сделайте отдельную панель для кнопок и поместите ее в BorderLayout.SOUTH.Затем поместите ваш основной материал в другую панель с GridBagLayout, и поместите его в BorderLayout.CENTER. Кнопки не будут идеально совмещены с вашими текстовыми компонентами, но я думаю, что все в порядке.

...