Java 在GridBagLayout中设置任意宽度

Java 在GridBagLayout中设置任意宽度,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,我试着做一个键盘布局,可以指定按钮的宽度。因此,我尝试了GridBagLayout,但没有成功。 为了说明我的问题,我做了一个简单的例子,我希望得到这个(按钮2,按钮4,按钮5,按钮6): 但我得到的是双倍宽度的按钮4和按钮6 代码是: package views; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.Grid

我试着做一个键盘布局,可以指定按钮的宽度。因此,我尝试了
GridBagLayout
,但没有成功。 为了说明我的问题,我做了一个简单的例子,我希望得到这个(按钮2,按钮4,按钮5,按钮6):

但我得到的是双倍宽度的按钮4和按钮6

代码是:

package views;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestLayout  extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestLayout().setVisible(true);
            }
        });
    }

    public TestLayout() {
        JButton btn;
        setBounds(0, 0, 444, 111);
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        gbc.gridy = 1;//ROW 1
        btn = new JButton("Button 1");gbc.gridx = 0;gbc.gridwidth = 1;add(btn, gbc);
        btn = new JButton("Button 2");gbc.gridx = 1;gbc.gridwidth = 2;add(btn, gbc);
        btn = new JButton("Button 3");gbc.gridx = 3;gbc.gridwidth = 1;add(btn, gbc);
        btn = new JButton("Button 4");gbc.gridx = 4;gbc.gridwidth = 2;add(btn, gbc);

        gbc.gridy = 2;//ROW 2
        btn = new JButton("Button 5");gbc.gridx = 0;gbc.gridwidth = 2;add(btn, gbc);
        btn = new JButton("Button 6");gbc.gridx = 2;gbc.gridwidth = 2;add(btn, gbc);
        btn = new JButton("Button 7");gbc.gridx = 4;gbc.gridwidth = 1;add(btn, gbc);
        btn = new JButton("Button 8");gbc.gridx = 5;gbc.gridwidth = 1;add(btn, gbc);
    }  
}
此外,我的目标是这样定义键盘,行与行之间没有关联,这是我用这个布局管理器无法实现的:


我把这件事交给了&camickr,用一个虚拟的组件行解决了它,每个组件的宽度为1
gridwidth
wide

这两幅图像显示:

  • 在底部,代码的“极简主义”版本使用1px高的透明图像
  • 在顶部,更明显的版本使用5像素高的纯黑色图像

  • import java.awt.*;
    导入java.awt.image.buffereImage;
    导入javax.swing.*;
    导入javax.swing.border.*;
    公共类键盘布局{
    私有JComponent ui=null;
    键盘布局(布尔低影响){
    initUI(低影响);
    }
    公共void initUI(布尔低影响){
    如果(ui!=null){
    返回;
    }
    ui=新的JPanel(新的GridBagLayout());
    ui.setboorder(新的空订单(4,4,4,4));
    GridBagConstraints gbc=新的GridBagConstraints();
    gbc.weightx=.5;
    gbc.weighty=0.5;
    gbc.fill=GridBagConstraints.BOTH;
    /*此代码添加一个虚拟(不可见)组件行,每行1个
    单个gridwidth列。它具有强制GBL宽度的效果
    我们期望的大小,与分配的每个网格宽度成比例。
    这种(简单)方法的问题在于
    宽度将根据PLAF和内容/首选更改
    可见组件的大小*/
    //TODO!改进“幻数”的使用
    int w=30;//根据需要调整宽度
    int h=低影响?1:5;//1表示小高度/边框,5表示大
    //为黑色输入\u INT\u RGB
    //输入不可见的\u INT\u ARGB
    int t=低影响?
    BuffereImage.TYPE_INT_ARGB:
    BufferedImage.TYPE_INT_RGB;
    //虚拟行的图标
    ImageIcon ii=新的ImageIcon(新的缓冲区图像(w,h,t));
    ui.setBorder(新的复合边框)(
    getBorder(),新的EmptyByOrder(0,0,h,0));
    //在顶行的每一列中放置一个“填充单元格”
    //强制布局尊重每一列的步骤
    对于(int i=0;i<22;i++){
    gbc.gridx=i;
    gbc.gridy=4;
    ui.添加(新的JLabel(ii));
    }
    gbc.gridx=0;
    gbc.gridy=1;
    gbc.gridwidth=3;
    增加(新的JButton(“1,1(3)”),gbc;
    gbc.gridx=3;
    gbc.gridwidth=2;
    添加(新的JButton(“2,1(2)”),gbc;
    gbc.gridx=5;
    增加(新按钮(“3,1(2)”),gbc;
    gbc.gridx=7;
    增加(新按钮(“4,1(2)”),gbc;
    gbc.gridx=9;
    增加(新按钮(“5,1(2)”),gbc;
    gbc.gridx=11;
    增加(新按钮(“6,1(2)”),gbc;
    gbc.gridx=13;
    增加(新按钮(“7,1(2)”),gbc;
    gbc.gridx=15;
    gbc.gridwidth=3;
    增加(新的按钮(“8,1(3)”),gbc;
    gbc.gridx=18;
    gbc.gridwidth=4;
    增加(新的按钮(“9,1(4)”),gbc;
    gbc.gridx=0;
    gbc.gridy=2;
    增加(新的JButton(“1,2(4)”),gbc;
    gbc.gridx=4;
    gbc.gridwidth=2;
    增加(新的按钮(“2,2(2)”),gbc;
    gbc.gridx=6;
    增加(新按钮(“3,2(2)”),gbc;
    gbc.gridx=8;
    增加(新的按钮(“4,2(2)”),gbc;
    gbc.gridx=10;
    增加(新按钮(“5,2(2)”),gbc;
    gbc.gridx=12;
    增加(新按钮(“6,2(2)”),gbc;
    gbc.gridx=14;
    增加(新按钮(“7,2(2)”),gbc;
    gbc.gridx=16;
    增加(新的按钮(“8,2(2)”),gbc;
    gbc.gridx=18;
    gbc.gridwidth=4;
    增加(新按钮(“9,2(4)”),gbc;
    gbc.gridx=0;
    gbc.gridy=3;
    gbc.gridwidth=5;
    增加(新按钮(“1,3(5)”),gbc;
    gbc.gridx=5;
    gbc.gridwidth=2;
    增加(新的按钮(“2,3(2)”),gbc;
    gbc.gridx=7;
    增加(新按钮(“3,3(2)”),gbc;
    gbc.gridx=9;
    增加(新按钮(“4,3(2)”),gbc;
    gbc.gridx=11;
    增加(新按钮(“5,3(2)”),gbc;
    gbc.gridx=13;
    增加(新按钮(“6,3(2)”),gbc;
    gbc.gridx=15;
    增加(新按钮(“7,3(2)”),gbc;
    gbc.gridx=17;
    增加(新的按钮(“8,3(2)”),gbc;
    gbc.gridx=19;
    gbc.gridwidth=3;
    增加(新的按钮(“9,3(3)”),gbc;
    gbc.gridx=0;
    gbc.gridy=4;
    gbc.gridwidth=3;
    增加(新的按钮(“1,4(3)”),gbc;
    gbc.gridx=3;
    增加(新按钮(“2,4(3)”),gbc;
    gbc.gridx=6;
    gbc.gridwidth=10;
    增加(新的按钮(“3,4(10)”),gbc;
    gbc.gridx=16;
    gbc.gridwidth=3;
    增加(新的JButton(“4,4(3)”),gbc;
    gbc.gridx=19;
    增加(新按钮(“5,4(3)”),gbc;
    gbc.gridx=0;
    gbc.gridy=4;
    gbc.gridwidth=1;
    }
    公共JComponent getUI(){
    返回用户界面;
    }
    公共静态void main(字符串[]args){
    Runnable r=新的Runnable(){
    @凌驾
    公开募捐{
    试一试{
    UIManager.setLookAndFeel(
    UIManager.getSystemLookAndFeelClassName());
    }捕获(异常使用默认值){
    }
    对于(int ii=0;ii<2;ii++){
    键盘布局o=新键盘B
    
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    import javax.swing.border.*;
    
    public class KeyBoardLayout {
    
        private JComponent ui = null;
    
        KeyBoardLayout(boolean lowImpact) {
            initUI(lowImpact);
        }
    
        public void initUI(boolean lowImpact) {
            if (ui != null) {
                return;
            }
    
            ui = new JPanel(new GridBagLayout());
            ui.setBorder(new EmptyBorder(4, 4, 4, 4));
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = .5;
            gbc.weighty = .5;
            gbc.fill = GridBagConstraints.BOTH;
    
            /* This code adds a dummy (invisible) row of components, 1 per 
             single gridwidth column.  It has the effect of forcing the GBL width 
             to the size we would expect, proportional to each gridwidth assigned.
             The problem with this (simple) approach is that the perfect 
             width will change according to PLAF and the content/preferred 
             size of the visible components. */
            // TODO! improve on use of 'magic numbers'
            int w = 30; // adjust width per requirement
            int h = lowImpact ? 1 : 5; // 1 for small height/border, 5 for large
            // TYPE_INT_RGB for black
            // TYPE_INT_ARGB for invisible
            int t = lowImpact ? 
                    BufferedImage.TYPE_INT_ARGB : 
                    BufferedImage.TYPE_INT_RGB;
            // an icon for the dummy row
            ImageIcon ii = new ImageIcon(new BufferedImage(w, h, t));
            ui.setBorder(new CompoundBorder(
                    ui.getBorder(), new EmptyBorder(0, 0, h, 0)));
            // put a 'padding cell' in each column of the top row
            // to force the layout to respect each individual column
            for (int i = 0; i < 22; i++) {
                gbc.gridx = i;
                gbc.gridy = 4;
                ui.add(new JLabel(ii));
            }
    
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.gridwidth = 3;
            ui.add(new JButton("1,1 (3)"), gbc);
    
            gbc.gridx = 3;
            gbc.gridwidth = 2;
            ui.add(new JButton("2,1 (2)"), gbc);
    
            gbc.gridx = 5;
            ui.add(new JButton("3,1 (2)"), gbc);
    
            gbc.gridx = 7;
            ui.add(new JButton("4,1 (2)"), gbc);
    
            gbc.gridx = 9;
            ui.add(new JButton("5,1 (2)"), gbc);
    
            gbc.gridx = 11;
            ui.add(new JButton("6,1 (2)"), gbc);
    
            gbc.gridx = 13;
            ui.add(new JButton("7,1 (2)"), gbc);
    
            gbc.gridx = 15;
            gbc.gridwidth = 3;
            ui.add(new JButton("8,1 (3)"), gbc);
    
            gbc.gridx = 18;
            gbc.gridwidth = 4;
            ui.add(new JButton("9,1 (4)"), gbc);
    
            gbc.gridx = 0;
            gbc.gridy = 2;
            ui.add(new JButton("1,2 (4)"), gbc);
    
            gbc.gridx = 4;
            gbc.gridwidth = 2;
            ui.add(new JButton("2,2 (2)"), gbc);
    
            gbc.gridx = 6;
            ui.add(new JButton("3,2 (2)"), gbc);
    
            gbc.gridx = 8;
            ui.add(new JButton("4,2 (2)"), gbc);
    
            gbc.gridx = 10;
            ui.add(new JButton("5,2 (2)"), gbc);
    
            gbc.gridx = 12;
            ui.add(new JButton("6,2 (2)"), gbc);
    
            gbc.gridx = 14;
            ui.add(new JButton("7,2 (2)"), gbc);
    
            gbc.gridx = 16;
            ui.add(new JButton("8,2 (2)"), gbc);
    
            gbc.gridx = 18;
            gbc.gridwidth = 4;
            ui.add(new JButton("9,2 (4)"), gbc);
    
            gbc.gridx = 0;
            gbc.gridy = 3;
            gbc.gridwidth = 5;
            ui.add(new JButton("1,3 (5)"), gbc);
    
            gbc.gridx = 5;
            gbc.gridwidth = 2;
            ui.add(new JButton("2,3 (2)"), gbc);
    
            gbc.gridx = 7;
            ui.add(new JButton("3,3 (2)"), gbc);
    
            gbc.gridx = 9;
            ui.add(new JButton("4,3 (2)"), gbc);
    
            gbc.gridx = 11;
            ui.add(new JButton("5,3 (2)"), gbc);
    
            gbc.gridx = 13;
            ui.add(new JButton("6,3 (2)"), gbc);
    
            gbc.gridx = 15;
            ui.add(new JButton("7,3 (2)"), gbc);
    
            gbc.gridx = 17;
            ui.add(new JButton("8,3 (2)"), gbc);
    
            gbc.gridx = 19;
            gbc.gridwidth = 3;
            ui.add(new JButton("9,3 (3)"), gbc);
    
            gbc.gridx = 0;
            gbc.gridy = 4;
            gbc.gridwidth = 3;
            ui.add(new JButton("1,4 (3)"), gbc);
    
            gbc.gridx = 3;
            ui.add(new JButton("2,4 (3)"), gbc);
    
            gbc.gridx = 6;
            gbc.gridwidth = 10;
            ui.add(new JButton("3,4 (10)"), gbc);
    
            gbc.gridx = 16;
            gbc.gridwidth = 3;
            ui.add(new JButton("4,4 (3)"), gbc);
    
            gbc.gridx = 19;
            ui.add(new JButton("5,4 (3)"), gbc);
    
            gbc.gridx = 0;
            gbc.gridy = 4;
            gbc.gridwidth = 1;
        }
    
        public JComponent getUI() {
            return ui;
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(
                                UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception useDefault) {
                    }
                    for (int ii = 0; ii < 2; ii++) {
                        KeyBoardLayout o = new KeyBoardLayout(ii==0);
    
                        JFrame f = new JFrame("Keyboard Layout");
                        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                        f.setLocationByPlatform(true);
    
                        f.setContentPane(o.getUI());
                        f.pack();
                        f.setMinimumSize(f.getSize());
    
                        f.setVisible(true);
                    }
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }