我如何实现GridBagLayout

时间:2016-04-13 19:18:44

标签: java swing user-interface jpanel gridbaglayout

如何在我的代码中添加gridbag布局,以便输出框在以下代码中提供的边框参数范围内跨越gui的长度?我有两个其他类,这项工作很好。当GUI填充它时,除输出文本框之外的所有工作都不会跨越gui的长度,因此文本框中的文本被切断,我想解决这个问题,但我不知道如何做到这一点,因为我从来没有使用了gridbaglayout。

下面是显示GUI应该如何显示的图像:

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

2 个答案:

答案 0 :(得分:2)

  

我从未使用过gridbaglayout

首先阅读How to Use GridBagLayout上的Swing教程中有关工作示例的部分。

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

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

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

答案 1 :(得分:1)

我的建议不是使用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);
    }
}

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

enter image description here

注意布局定义如下: -

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中的13列扩展到列7

有关更多高级用途,请参阅: -

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