当前位置: 首页 > 知识库问答 >
问题:

GridBagLayout控制Swing中的对齐

郭易安
2023-03-14

我有一个几乎到处都是JScrollPane的窗口。我正在向它添加大按钮(带有图像),我希望它们继续向下添加,这就是为什么我使用GridBagLayout并设置gbc。gridx,gbc。gridy每次我添加一个按钮。

但问题是,当我添加不到4个按钮时,它们会对齐到行的中心,而不是我想要的左侧。就像这样

你知道我该怎么把它们对准左边吗?我试过gbc。锚定和gbc。填充但没有运气。谢谢

这是我的JScrollPane

private JPanel imagesPanel() {
        JPanel panel = new JPanel(new GridBagLayout());

        int x = 0;
        int y = 0;

        GridBagConstraints c = new GridBagConstraints();
        //c.anchor = GridBagConstraints.NORTHWEST;

        //add all images as buttons
        List<PuzzleImage> imageList = _imageLoader.getImageCollection().getAllImages();
        for(PuzzleImage puzzleImage : imageList) {
            for(int i = 0; i < 1; i++) { //ignore this, just for debugging. i add 3 images
                ImageIcon imageIcon = new ImageIcon(puzzleImage.getLowScaleImage());

                c.gridx = x;
                c.gridy = y;
                c.weightx = 1.0;

                JButton btn = new JButton(imageIcon);
                btn.setPreferredSize(new Dimension(ImageLoader.LOW_SCALE_IMAGE_SIZE, ImageLoader.LOW_SCALE_IMAGE_SIZE));
                panel.add(btn, c);

                x++;
                if(x>=4) {
                    x = 0;
                    y++;
                }
            }
        }

        return panel;
    }

共有2个答案

谢俊英
2023-03-14

没有你的代码很难给出准确的答案,但是这里有一个可能的解决方案:

你可以把你的JPanel保存所有的图片,并把它嵌套在另一个JPanel中,使它像这样锚定在左边:

JPanel pictures = /* already defined */;
JPanel container = new JPanel(new BorderLayout());

container.add(pictures, BorderLayout.WEST);
//add container to your scroll container
苏鹏鹍
2023-03-14

但问题是,当我添加少于4个按钮时,它们会对齐到行的中心,而不是像我希望的那样对齐到左侧

至少有一个组件需要具有大于0的权重约束。

阅读Swing教程中关于如何使用GridBagLayout的部分。解释约束如何工作的部分将提供更多信息。

你为什么要使用GridBagLayout?在你的最后一个问题中,我给了你一个简单的解决方案:Swing中的FlowLayout不会移动到下一行。然后你甚至不需要担心约束。

或者你可以使用一个GridLayout你只需要定义你想要4列和组件自动包装。您可能需要嵌套面板,以便组件不会因框架的大小而收缩/增长。

基本代码是:

JPanel wrapper = new JPanel();
JPanel buttons = new JPanel( new GridLayout(0, 4) );

for (...)
{
    JButton button = new JButton(...);
    buttons.add( button );
}

frame.add(wrapper);
 类似资料:
  • 问题内容: 我想以有意义的方式使用Swing将MVC设计应用于Java应用程序。因此,我的问题是,如何在Java Swing中构造控制器? 我有两个选择: 每个组件侦听器都是自己的类,作为控制器包的一部分 每个组件侦听器都是视图包中的一个匿名类,该类将其调用委托给具有控制器方法的类。 两者都有可能吗?是偏好问题还是明确定义的? 问题答案: Controller构成了组件接口的另一半,主要是交互的一

  • 问题内容: 我在设计要开发的应用程序体系结构时遇到了一些麻烦。我正在研究JAVA,因此开始研究此应用程序是因为我想加深对JAVA,体系结构和模式的整体了解。我想遵循指导方针来制作可复用的,低耦合的应用程序,就像应该的那样。该应用程序只有一个JFrame,但内部有几个JPanel,每个JPanel代表应用程序的一个模块。 问题是:在JAVA Swing中,如何实现适当的MVC模式?我在如何理解应该完

  • 我在设计我要开发的应用程序的架构时遇到了一些问题。我正在研究JAVA,我开始研究这个应用程序,因为我想加深我对JAVA、体系结构和模式的全面了解。我想按照这些指导原则来创建一个可重用、低耦合的应用程序,就像它应该做的那样。应用程序只有一个JFrame,但其中有几个JPanel,每个代表应用程序的一个模块。 问题是:在JAVA Swing中,如何实现一个合适的MVC模式?我在如何理解应该如何做的问题

  • 问题内容: 我试图在单个行上具有多个JTextField,但是我不希望它们具有相同的宽度。如何控制宽度并使其中一些比其他更宽?我希望它们一起占总宽度的100%,所以如果我可以使用某种重量的东西,那将是很好的。 我试过了,但是没有道理。 这是一个示例,其中我使用了三行和三个字符串,这些字符串应按列显示: 问题答案: 所有Swing组件均具有首选大小。文本组件的首选大小基于组件的文本。因此,一般情况下

  • 我使用创建面板。 我想要面板右角的删除图标。但是,如果未将添加到面板中,删除图标将向左移动。 如何正确地做到这一点? 这是我的GridBagLayout面板设置代码 有添加组件到面板的代码

  • 这个问题主要是关于在Java-Swing中实现MVC体系结构的标准实践。我知道以前有人问过这个问题,但我想更具体地介绍一下控制器的使用。 我一直在分离我的模型、视图和控制器,其中: 数据在模型类内处理 Swing组件位于视图类中 事件处理匿名类也在视图类(用户输入)中 控制器类包含对模型和视图对象的引用 回到具体的控制器-我一直使用类(静态)变量来表示控制器,以方便应用程序的任何部分访问。因此我的