JPanel在JScrollPane中填充了Buttons

时间:2014-03-17 17:10:57

标签: java swing layout-manager

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

创建面板:

panel_game = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane(panel_game);

尝试调整JPanel的大小:(其中x和y是按钮的数量,缩放大小)

panel_game.setLayout(new java.awt.GridLayout(x, y));
panel_game.setBounds(panel_game.getX()+5,panel_game.getY()+5,x*zoomlvl-5,y*zoomlvl);
panel_game.setPreferredSize(new Dimension(x*zoomlvl,y*zoomlvl));  

添加按钮:(f是我的playfield,2D-Array)(按钮是Arraylist,包含我的按钮)

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

我不知道如何告诉Java自动停止调整我的按钮等。 帮助将不胜感激:))

2 个答案:

答案 0 :(得分:1)

构建GridLayout以填充将其与组件一起使用的容器。如果容纳按钮的容器的大小受到限制,则按钮将拉伸或填充以尽可能紧密地填充该容器。一个解决方案可能是嵌套布局管理器,以便不会发生这种情况,但我无法在没有更多代码的情况下提供更具体的建议,尤其是minimal example program。图像也可能有所帮助。

答案 1 :(得分:1)

如果你想阻止&#34;按钮网格面板&#34;从拉伸到填充ScrollPane的整个视口区域,您可以将此网格面板放入另一个面板(使用FlowLayout)。

一般来说,你应该

  • 未设置panel_game OR
  • 的首选大小
  • 未设置按钮的首选大小

因为

  • 当您设置按钮的首选大小时,面板的首选大小将根据按钮的首选大小计算
  • 当您设置面板的首选尺寸时,按钮的大小将分别由面板的大小决定

也许这就是你想要实现的目标:

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