Установка размера JButton при использовании GridBagLayout

У меня есть этот простой JFrame, и я хочу знать, как установить высоту кнопки, чтобы точно соответствовать высоте текстового поля. Почему не работают вставки справа от кнопки? Между кнопкой и границей окна нет отступов.

import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame {
    public static void main(String[] args) {
        new MyFrame();
    }

    public MyFrame() {
        super("My Frame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridBagLayout());

        GridBagConstraints c;
        final Insets insets = new Insets(4, 4, 4, 4);

        JLabel dbLocationLabel = new JLabel("Database file:");
        c = new GridBagConstraints();
        c.insets = insets;
        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_START;
        this.add(dbLocationLabel, c);

        JTextField dbLocationText = new JTextField();
        c = new GridBagConstraints();
        c.insets = insets;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        c.gridwidth = 5;
        c.gridy = 0;
        c.weightx = 0.1;
        this.add(dbLocationText, c);

        JButton dbLocationButton = new JButton("...");
        c = new GridBagConstraints();
        c.insets = insets;
        c.gridx = 2;
        c.gridy = 0;
        this.add(dbLocationButton);

        this.setSize(500, 150);
        this.setLocation(300, 400);
        this.setVisible(true);
    }
}

person Pawel P.    schedule 01.12.2013    source источник


Ответы (2)


1) Вы должны всегда иметь главную панель JPanel. Никогда не помещайте компоненты непосредственно в JFrame. Вы избавите себя от многих будущих печалей.

2) Вы забыли ограничения на добавление JButton.

3) Я изменил заливку JTextField на ОБА, чтобы сделать JTextField выше.

Вот измененный код.

import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame {
    private static final long   serialVersionUID    = 1L;

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

    public MyFrame() {
        super("My Frame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new GridBagLayout());

        GridBagConstraints c;
        final Insets insets = new Insets(4, 4, 4, 4);
        final Insets buttonInsets = new Insets(4, 4, 4, 8);

        JLabel dbLocationLabel = new JLabel("Database file:");
        c = new GridBagConstraints();
        c.insets = insets;
        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_START;
        mainPanel.add(dbLocationLabel, c);

        JTextField dbLocationText = new JTextField();
        c = new GridBagConstraints();
        c.insets = insets;
        c.fill = GridBagConstraints.BOTH;
        c.gridx = 1;
//        c.gridwidth = 5;
        c.gridy = 0;
        c.weightx = 0.1;
        mainPanel.add(dbLocationText, c);

        JButton dbLocationButton = new JButton("...");
        c = new GridBagConstraints();
        c.insets = buttonInsets;
        c.gridx = 2;
        c.gridy = 0;
        mainPanel.add(dbLocationButton, c);

        this.add(mainPanel);
        this.setSize(500, 150);
        this.setLocation(300, 400);
        this.setVisible(true);
    }
}
person Gilbert Le Blanc    schedule 01.12.2013
comment
Это прекрасно работает. Единственное, я хотел сделать buttun меньше, а не textField больше. Причина в том, что у меня будет другое текстовое поле во второй строке, которое не будет содержать кнопки. Таким образом, два текстовых поля будут иметь разную высоту. - person Pawel P.; 01.12.2013
comment
@John N.: Поместите JButton во вторую строку и установите Visible (false). Честно говоря, большинству людей все равно, что кнопки больше, чем текстовые поля. - person Gilbert Le Blanc; 01.12.2013

SSCCE:

package stack;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class SameHeight extends JFrame {

    JTextField jtf;
    JButton btn;

    public SameHeight(){
        GridBagConstraints gbc = new GridBagConstraints();
        jtf = new JTextField(30);
        btn = new JButton("Click Me");

        getContentPane().setLayout(new GridBagLayout());
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 7;
        gbc.gridheight = 3;
        gbc.fill = GridBagConstraints.BOTH;

        getContentPane().add(jtf,gbc);
        gbc.gridx = 8;
        getContentPane().add(btn,gbc);

        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

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

            @Override
            public void run() {
                new SameHeight();

            }
        });
    }
}  

Вывод:
введите здесь описание изображения

Объяснение.
Убедитесь, что ваши JTextField и JButton имеют одинаковые gridheight. Кроме того, установите fill из GridBagConstraints на GridBagConstraints.BOTH. Таким образом, ваши компоненты будут растягиваться, чтобы соответствовать ширине и высоте.

person An SO User    schedule 01.12.2013