如何在我的代码中添加gridbag布局,以便输出框在以下代码中提供的边框参数范围内跨越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);
答案 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);
}
}
之前的代码产生以下内容: -
注意布局定义如下: -
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