Java JPanel在JScrollPane中填充了按钮

Java JPanel在JScrollPane中填充了按钮,java,swing,layout-manager,Java,Swing,Layout Manager,我目前正在尝试用按钮填充JPanel(使用GridLayout)。这些按钮应该是具有设定宽度的正方形。 该程序应该能够调整比赛场地的大小(n*m按钮)。问题是,按钮会自动拉伸以完全填充JScrollpane,完全忽略设置的高度和宽度。这样就不需要滚动条了。 这是我的密码: 创建面板: panel_game = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(panel_game); 尝试调整JPanel的

我目前正在尝试用按钮填充JPanel(使用GridLayout)。这些按钮应该是具有设定宽度的正方形。 该程序应该能够调整比赛场地的大小(n*m按钮)。问题是,按钮会自动拉伸以完全填充JScrollpane,完全忽略设置的高度和宽度。这样就不需要滚动条了。 这是我的密码:

创建面板:

panel_game = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane(panel_game);
尝试调整JPanel的大小:(其中x和y是按钮的数量,zoomlvl是大小)

添加按钮:(f是我的游戏场,一个2D数组)(buttons是一个Arraylist,包含我的按钮)


用于(int i=0;iGridLayout是为使用组件填充容器而构建的。如果容纳按钮的容器在大小上受到限制,则按钮将拉伸或填充以尽可能紧密地填充该容器。解决方案可能是嵌套布局管理器,这样就不会发生这种情况,但我无法给出更具体的建议更多代码,尤其是.Images可能也会有所帮助。

如果您想防止“按钮网格面板”拉伸以填充滚动窗格的整个视口区域,可以将此网格面板放置到另一个面板中(使用
FlowLayout

一般来说,你应该

  • 未设置
    面板\u游戏的首选大小
  • 未设置按钮的首选大小
因为

  • 设置按钮的首选尺寸时,面板的首选尺寸将根据按钮的首选尺寸计算
  • 设置面板的首选大小时,按钮的大小将分别由面板的大小决定
也许这就是你想要实现的目标:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

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

public class ScrollButtonGrid
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int x = 5;
        int y = 5;
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(x, y));
        for(int i=0; i<x*y;i++){
            JButton button = new JButton(String.valueOf(i));
            button.setPreferredSize(new Dimension(100,100));
            panel.add(button);
        }
        JPanel container = new JPanel(new FlowLayout(FlowLayout.CENTER, 0,0));
        container.add(panel);
        JScrollPane scrollPane = new JScrollPane(container);
        f.getContentPane().add(scrollPane);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.GridLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
公共类ScrollButtonGrid
{
公共静态void main(字符串[]args)
{
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
createAndShowGUI();
}
});
}
私有静态void createAndShowGUI()
{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int x=5;
int y=5;
JPanel面板=新的JPanel();
panel.setLayout(新网格布局(x,y));

对于(int i=0;iConsider创建并发布一个,我们可以编译并运行它,它显示了您的布局,但是它没有与您的问题相关的代码。换句话说,不要给您的按钮任何ActionListener,不要使用任何图像文件或任何非Java文件。请阅读链接了解我们想要的详细信息嗯。
for(int i=0; i<f.getSize()[0]*f.getSize()[1];i++){
    buttons.add(new JButton());
    buttons.get(i).setSize(zoomlvl, zoomlvl);
    buttons.get(i).setPreferredSize(new Dimension(zoomlvl,zoomlvl));
    panel_game.add(buttons.get(i));
} 
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

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

public class ScrollButtonGrid
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int x = 5;
        int y = 5;
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(x, y));
        for(int i=0; i<x*y;i++){
            JButton button = new JButton(String.valueOf(i));
            button.setPreferredSize(new Dimension(100,100));
            panel.add(button);
        }
        JPanel container = new JPanel(new FlowLayout(FlowLayout.CENTER, 0,0));
        container.add(panel);
        JScrollPane scrollPane = new JScrollPane(container);
        f.getContentPane().add(scrollPane);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}