Java JButton默认大小可以为';不能在网格布局中更改

Java JButton默认大小可以为';不能在网格布局中更改,java,swing,jbutton,gridbaglayout,Java,Swing,Jbutton,Gridbaglayout,JButtons有默认大小,我无法更改。我试过setSize,但它什么也没做。当我点击一些按钮时,图片将被设置,按钮将获得图片的大小。我想将JButton的大小设置为与单击JButton时的大小相同(JButton with picture) btn=newjbutton[9]; j=0; 对于(i=0;i可能最简单和最可靠的解决方案是使用与其他图像大小相同的空白图像作为按钮的初始图像 很少有布局管理器允许您直接建议给定组件的大小,事实上,其目的是让组件告诉布局管理器它想要什么,然后让布局管理器

JButtons有默认大小,我无法更改。我试过setSize,但它什么也没做。当我点击一些按钮时,图片将被设置,按钮将获得图片的大小。我想将JButton的大小设置为与单击JButton时的大小相同(JButton with picture)

btn=newjbutton[9];
j=0;

对于(i=0;i可能最简单和最可靠的解决方案是使用与其他图像大小相同的空白图像作为按钮的初始图像

很少有布局管理器允许您直接建议给定组件的大小,事实上,其目的是让组件告诉布局管理器它想要什么,然后让布局管理器确定它是否能够满足它

例如

公共类测试窗格扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
BuffereImage img=新的BuffereImage(32,32,BuffereImage.TYPE_INT_ARGB);
Graphics2D g2d=img.createGraphics();
g2d.setBackground(新颜色(255,255,255,0));
g2d.clearRect(0,0,32,32);
g2d.dispose();
GridBagConstraints gbc=新的GridBagConstraints();
对于(int行=0;行<3;行++){
gbc.gridy=行;
for(int col=0;col<3;col++){
gbc.gridx=col;
添加(新JButton(新图像图标(img)),gbc);
}
}
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
}

在本例中,我创建了自己的空白图像,您也可以这样做,但加载空白图像同样容易,概念是相同的

可能最简单和最可靠的解决方案是使用与其他图像大小相同的空白图像作为按钮的初始图像

很少有布局管理器允许您直接建议给定组件的大小,事实上,其目的是让组件告诉布局管理器它想要什么,然后让布局管理器确定它是否能够满足它

例如

公共类测试窗格扩展了JPanel{
公共测试窗格(){
setLayout(新的GridBagLayout());
BuffereImage img=新的BuffereImage(32,32,BuffereImage.TYPE_INT_ARGB);
Graphics2D g2d=img.createGraphics();
g2d.setBackground(新颜色(255,255,255,0));
g2d.clearRect(0,0,32,32);
g2d.dispose();
GridBagConstraints gbc=新的GridBagConstraints();
对于(int行=0;行<3;行++){
gbc.gridy=行;
for(int col=0;col<3;col++){
gbc.gridx=col;
添加(新JButton(新图像图标(img)),gbc);
}
}
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
}

在本例中,我创建了自己的空白图像,您也可以这样做,但加载空白图像同样容易,概念与您相同:使用空白图像;使用
fill
weightx/y
约束和/或
ipadx/y
约束;使用
GridLayout
setPreferredSize工作!@GlacialMan
setPreferredSize
是一个坏主意,它代表了一种习惯,会导致你无休止的问题,要学会没有它的生活。你可以:使用空白图像;使用
填充
权重x/y
约束和/或
ipadx/y
约束;使用
网格布局
设置PreferredSize工作!@Glacalman
设置PreferredSize
iit’这是一个坏主意,代表着一种习惯,它会导致你无穷无尽的问题,学会没有它的生活。是的,我想过了,但稍后我会检查图片是否相同,这样我就会得到答案,图片是相同的same@GlacialMan
setPreferredSize
是那些“look”的隐蔽函数之一就像他们解决了你的问题,但从长远来看,哪种简单的方法会让你的生活变得更困难,学会没有它的生活。你不应该检查图像状态,你应该有一个虚拟的游戏模型,其中包含实际的游戏状态,按钮只是一个视觉上的表示是的,我想过,但稍后我会ck:图片是一样的,所以我总是会得到答案,图片是一样的same@GlacialMan
setPreferredSize
是那些“look”的隐蔽函数之一就像他们解决了你的问题,但从长远来看,哪种简单的方式会继续让你的生活变得更加困难一样,学会在没有它的情况下生活。你不应该检查图像状态,你应该有一个虚拟的游戏模型,其中包含实际的游戏状态,而按钮只是游戏的视觉表现
    btn=new JButton[9];
    j=0;

    for (i = 0; i <btn.length; i++) {
        btn[i] = new JButton("");
        btn[i].addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                if(j%2==0){
                    ((JButton) e.getSource()).setIcon(new ImageIcon("resources/X.png"));
                }else{
                    ((JButton) e.getSource()).setIcon(new ImageIcon("resources/O.png"));
                }
                ((JButton) e.getSource()).setEnabled(false);
                j++;
            }
        });

    }

GridBagConstraints gbc=new GridBagConstraints();

gbc.gridx=0;
gbc.gridy=0;
p2.add(btn[0],gbc);

gbc.gridx=1;
gbc.gridy=0;
p2.add(btn[1],gbc);

gbc.gridx=2;
gbc.gridy=0;
p2.add(btn[2],gbc);

 .........
public class TestPane extends JPanel {

    public TestPane() {
        setLayout(new GridBagLayout());
        BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        g2d.setBackground(new Color(255, 255, 255, 0));
        g2d.clearRect(0, 0, 32, 32);
        g2d.dispose();
        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 3; row++) {
            gbc.gridy = row;
            for (int col = 0; col < 3; col++) {
                gbc.gridx = col;
                add(new JButton(new ImageIcon(img)), gbc);
            }
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

}