【问题标题】:How do I need to implement GridBagLayout我需要如何实现 GridBagLayout
【发布时间】:2016-04-13 19:18:43
【问题描述】:

如何将网格包布局添加到我的代码中,以使输出框跨越以下代码中提供的边框参数内的 gui 长度?我还有另外两个课程可以很好地完成这项工作。当 GUI 填充时,除了输出文本框不跨越 gui 的长度外,它都可以工作,因此文本框中的文本被截断,我想解决这个问题,但我不知道该怎么做,因为我从来没有使用了gridbaglayout。

下图显示了 GUI 的外观:

有问题的代码如下:

    public ATMGui() {
        checkingAcc = new Account(1000);
        savingAcc = new Account(2000);
        currentSelect = new Account(0);
        atmFrame = new JFrame("Automated Teller Machine");
        output = new JTextField();
        panel = new JPanel();

我认为问题可能是因为我没有完全声明输出框的大小,所以它只能跨越一个网格,可以这么说,而我希望它跨越两个网格。有人可以帮我决定是在上面的代码中以不同的方式声明网格还是在下面的代码中声明网格?另外,我已经阅读了 GridBagLayout 和其他方法,但我的问题是我不确定如何/在哪里实现它。

        atmWithdraw = new JButton("Withdraw");
        atmDeposit = new JButton("Deposit");
        transfer = new JButton("Transfer to");
        balance = new JButton("Balance");
        atmWithdraw.addActionListener(this);

        panel.setLayout(new GridLayout(4, 2));
        panel.setBorder(BorderFactory.createEmptyBorder(15, 15, 0, 15));
        panel.add(atmWithdraw, 0);
        panel.add(atmDeposit, 1);
        panel.add(transfer, 2);
        panel.add(balance, 3);
        panel.add(checking, 4);
        panel.add(savings, 5);
        panel.add(output, BorderLayout.LINE_END);
        atmFrame.add(panel);

        atmFrame.setSize(300, 175);
        atmFrame.setVisible(true);

【问题讨论】:

  • 如果您以前从未使用过 GridBagLayout,现在是时候学习它了
  • 那不是 SSCCE!!!我们对与框架上组件的布局没有直接关系的任何代码不感兴趣,因为您的问题专门针对布局管理器。
  • 知道了,谢谢你的链接

标签: java swing user-interface jpanel gridbaglayout


【解决方案1】:

我从未使用过gridbaglayout

首先阅读 How to Use GridBagLayout 上的 Swing 教程部分以获取工作示例。

工作示例展示了如何让按钮跨越框架的整个宽度。您需要使用"grid width" 约束。本教程解释了如何使用所有约束。

另一个选项是嵌套布局管理器。所以也许你使用框架的标准BorderLayout。然后创建一个面板并使用 GridBagLayout 将一些组件添加到面板,然后将面板添加到 CENTER。然后您可以将您的“输出框”添加到BorderLayout.PAGE_END。默认情况下,组件将填充水平空间。

重点是阅读教程并学习每个布局管理器的基础知识。然后使用适当的布局管理器组合来完成工作。

【讨论】:

  • 我已经准备好了,我正在阅读问题是我主要是通过在线大学自学的,这根本没有帮助,所以阅读如何做有点令人困惑,但我试图理解这些概念所以这一切都说得通
  • I am self taught 我也是,这就是为什么我使用教程作为工作示例来了解基础知识。下载演示代码并进行测试。以身作则。如果有关于教程代码的特定问题,那么您会问它,但我们猜测您可能对工作代码了解或不了解。
  • 所以我一直在搞乱 c.fill 什么都没有,我已经让它运行但我得到的最接近的是输出窗格几乎消失了,并且在储蓄收音机旁边按钮。所以我想在这一点上我理解了这个概念,我只是不确定如何将它应用于我的特定问题集,如果这有意义的话?
  • if that makes sense? - 不是真的。我真的无法弄清楚你想要做什么。您发布的代码甚至不使用 GridBagLayout。还建议您不需要使用 GridBagLayout。您可以使用任何合适的布局管理器。你需要做的是START OVER。您首先创建一个仅包含组件的框架。您的其余代码与所述问题完全无关。代码无法编译,因为我们无权访问 Account 类。无论如何布局都不需要它。不需要 ActionListener 代码。
  • so i have been messing around with the c.fill - 这对我们没有帮助。我们看不到您正在使用的代码。发布正确的SSCCE,显示您仅使用框架上的组件和布局代码所做的事情。那么也许有人可以帮助你。同样,让组件填充屏幕宽度的最简单方法是将其添加到 PAGE_START 或 PAGE_END。在继续学习其他更复杂的布局管理器之前,请先了解 BorderLayout 的基础知识。
【解决方案2】:

我的建议是不要使用 GridBagLayout,而是使用更容易使用(但同样强大)的东西,例如 TableLayout (http://www.oracle.com/technetwork/java/tablelayout-141489.html)。要使用包含下载库并包含在类路径中或使用以下 maven 包含:-

<dependency>
    <groupId>info.clearthought</groupId>
    <artifactId>table-layout</artifactId>
    <version>4.3.0</version>
</dependency>

(详情请见https://github.com/nerro/table-layout

包含后,您可以将表格布局定义为简单的二维数字数组,例如

import info.clearthought.layout.TableLayout;

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

public class Test {

    public static void main(String [] args) {

        // Create JPanel using TableLayout as layout manager

        double PREF = TableLayout.PREFERRED;
        double BORDER = 10;
        double size[][] = { { BORDER, 0.50, 10, 0.50, 10 }, { 10, PREF, 10, PREF, 10, PREF, 10, PREF, 10 } };

        JPanel panel = new JPanel(new TableLayout(size));

        panel.add(new JButton("Withdraw"), "1,1");
        panel.add(new JButton("Deposit"), "3,1");
        panel.add(new JButton("Transfer to"), "1,3");
        panel.add(new JButton("Balance"), "3,3");

        panel.add(new JRadioButton("Checking"), "1,5");
        panel.add(new JRadioButton("Savings"), "3,5");

        panel.add(new JTextField(), "1,7,3,7");

        // Add to JFrame and Display

        JFrame frame = new JFrame("ATM Machine");
        frame.setSize(300, 200);
        frame.setContentPane(panel);
        frame.setVisible(true);
    }
}

前面的代码产生以下内容:-

注意布局定义如下:-

double size[][] = { { WIDTH1, WIDTH2, ...  }, { HEIGHT1, HEIGHT2, ...  } };`

2 列宽度指定为 50% 或 0.50。 [0.0..1.0) 范围内的所有实数表示百分比,例如请参阅BORDER 变量。常量 FILL 分配 100% 的可伸缩空间,PREFERRED 填充到组件的首选大小。这允许窗口很好地调整大小。

要添加到这个框架,它比 GridBagLayout 更容易,即只需单元格 X/Y 位置,例如

panel.add(new JButton("Withdraw"), "1,1");
panel.add(new JButton("Deposit"), "3,1");

我们可以跨多个列如下:-

panel.add(new JTextField(), "1,7,3,7");

这跨越了JTextField 从列1 到列3 在行7

更多高级用法见:-

http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/Simple.html

【讨论】:

  • 我已经阅读了教程,但我不相信这会有所帮助,但是我会尝试这个,只是不在这个项目上,我只是想找到一种方法来制作输出框初始 gui 弹出在框架中扩展,因此在运行此代码的功能时不会切断输出虽然感谢您的输入
  • 您能否附上您想要实现的目标的屏幕截图(我尝试运行您的代码,但由于缺少类而无法运行)。 Java 中还没有一个我无法使用 TableLaoyout 布局的 GUI 屏幕
  • 更新了答案以显示 TableLayout 将如何实现这一点
猜你喜欢
  • 2014-03-14
  • 2014-10-07
  • 2018-09-15
  • 2019-08-28
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多