【问题标题】:Setting JButton size while using GridBagLayout使用 GridBagLayout 时设置 JButton 大小
【发布时间】:2013-12-01 16:50:28
【问题描述】:

我有这个简单的 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);
    }
}

【问题讨论】:

    标签: java swing jbutton jtextfield gridbaglayout


    【解决方案1】:

    1) 您应该始终拥有一个主 JPanel。 切勿将组件直接放在 JFrame 上。你会为自己省去很多未来的悲伤。

    2) 你忘记了对 JButton add 的约束。

    3) 我将 JTextField 上的填充更改为 BOTH 以使 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);
        }
    }
    

    【讨论】:

    • 这很好用。唯一的事情是,我想让按钮变小,而不是让 textField 变大。原因是,我将在第二行有其他不包含按钮的 txtfield。所以两个文本字段会有不同的高度。
    • @John N.:将 JButton 放在第二行并设置可见(假)。老实说,大多数人并不关心按钮比文本字段大。
    【解决方案2】:

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

    输出:

    说明:
    确保您的JTextFieldJButton 具有相同的gridheight。另外,将GridBagConstraintsfill 设置为GridBagConstraints.BOTH。这样,您的组件将拉伸以适应宽度和高度。

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 2014-11-14
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2013-03-01
      相关资源
      最近更新 更多