因此,我有我的标签和所有添加,但我仍然有困难的格式化和对齐一切。计算按钮显然应该居中。我知道,使用网格包将框架分割成坐标系,当一列大于另一列时,它会调整另一列,并将其抛出(对吗?)但我不知道怎么解决这个问题。而且仍然很难把所有的东西都对准左边,这样就不会从中间开始。
在这里编译时,窗口

这就是我想要得到的,我还没有添加所有的东西。

JPanel p = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
//0 Column
gc.gridx = 0;
gc.gridy = 0;
gc.anchor = GridBagConstraints.EAST;
p.add(new JLabel("Mortgage amount:"),gc);
gc.gridx = 0;
gc.gridy =1;
p.add(new JLabel("Mortgage term:"),gc);
gc.gridx = 0;
gc.gridy = 2;
p.add(new JLabel("Interest rate:"),gc);
gc.gridx = 0;
gc.gridy = 3;
p.add(new JLabel("Mortgage start date:"),gc);
gc.gridx = 0;
gc.gridy= 4;
p.add(new JLabel("Monthly Payments:"),gc);
gc.gridx = 0;
gc.gridy = 7;
p.add(new JLabel("Extra payments"),gc);
gc.gridx = 0;
gc.gridy = 8;
p.add(new JLabel("Adding: "),gc);
gc.gridx = 0;
gc.gridy = 9;
p.add(new JLabel("Adding: "),gc);
gc.gridx = 0;
gc.gridy = 10;
p.add(new JLabel("Adding: "),gc);
gc.gridx = 0;
gc.gridy = 11;
p.add(new JLabel("Changes paid off date to:"),gc);
//1 Column
gc.gridx = 1;
gc.gridy = 0;
p.add(new JLabel("$"),gc);
gc.gridx = 1;
gc.gridy = 4;
p.add(new JLabel("$"),gc);
gc.gridx = 1;
gc.gridy = 8;
p.add(new JLabel("$"),gc);
gc.gridx = 1;
gc.gridy = 9;
p.add(new JLabel("$"),gc);
gc.gridx = 1;
gc.gridy = 10;
p.add(new JLabel("$"),gc);
//2 column
gc.gridx = 2;
gc.gridy = 0;
p.add(new JTextField(8),gc);
gc.gridx = 2;
gc.gridy =1;
p.add(new JTextField(8),gc);
gc.gridx = 2;
gc.gridy = 2;
p.add(new JTextField(8),gc);
gc.gridx = 2;
gc.gridy = 3;
p.add(new JComboBox(month),gc);
gc.gridx= 2;
gc.gridy = 4;
p.add(new JTextField(8),gc);
gc.gridx = 2;
gc.gridy = 8;
p.add(new JTextField(8),gc);
gc.gridx = 2;
gc.gridy = 9;
p.add(new JTextField(8),gc);
gc.gridx = 2;
gc.gridy = 10;
p.add(new JTextField(8),gc);
//3 column
gc.gridx = 3;
gc.gridy = 1;
p.add(new JLabel(" years or "),gc);
gc.gridx = 3;
gc.gridy = 2;
p.add(new JLabel(" % per year"),gc);
gc.gridx = 3;
gc.gridy = 3;
p.add(new JComboBox(days),gc);
gc.gridx = 3;
gc.gridy = 8;
p.add(new JLabel("to your monthly mortgage payment"),gc);
gc.gridx = 3;
gc.gridy = 9;
p.add(new JLabel("as an extra yearly mortgage payment every "),gc);
gc.gridx = 3;
gc.gridy = 10;
p.add(new JLabel("as a one-time payment in "),gc);
//4 column
gc.gridx = 4;
gc.gridy = 1;
p.add(new JTextField(8),gc);
gc.gridx = 4;
gc.gridy=3;
p.add(new JComboBox(years),gc);
//5 column
gc.gridx = 5;
gc.gridy = 1;
p.add(new JLabel(" months"),gc);
gc.gridy=5;
gc.anchor = GridBagConstraints.CENTER;
p.add(new JButton("Calculate"),gc);
add(p, BorderLayout.NORTH);
}
}发布于 2015-04-22 13:59:59
由于您没有指定调整大小的行为,所以可以使用许多布局管理器来获得非常相似的结果。正如@MadProgrammer所提到的,两个面板可能是一个很好的方法,对于顶部的面板,我将GridBagLayout用于教育目的,而最底层的面板则留给您自己来实现,尽管这个面板不会从GridBagLayout中受益,也可以使用一个更简单的布局管理器(比如BoxLayout)。
public class Mort extends JFrame {
public static void main(String[] args) {
new Mort();
}
Mort() {
JPanel topPanel = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
JPanel tempPanel;
gc.anchor = GridBagConstraints.LINE_START;
// Top
// 0 Column
gc.gridx = 0;
gc.gridy = 0;
topPanel.add(new JLabel("Mortgage amount:"), gc);
gc.gridy = 1;
topPanel.add(new JLabel("Mortgage term:"), gc);
gc.gridy = 2;
topPanel.add(new JLabel("Interest rate:"), gc);
gc.gridy = 3;
topPanel.add(new JLabel("Mortgage start date:"), gc);
gc.gridy = 4;
topPanel.add(new JLabel("Monthly Payments:"), gc);
gc.gridy = 5;
gc.gridwidth = GridBagConstraints.REMAINDER;
gc.anchor = GridBagConstraints.CENTER;
topPanel.add(new JButton("Calculate"), gc);
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_START;
// 1 Column
gc.gridx = 1;
gc.gridy = 0;
tempPanel = new JPanel();
tempPanel.add(new JLabel("$"));
tempPanel.add(new JTextField(8));
topPanel.add(tempPanel, gc);
gc.gridy = 1;
tempPanel = new JPanel();
tempPanel.add(new JTextField(8));
tempPanel.add(new JLabel("years of"));
tempPanel.add(new JTextField(8));
tempPanel.add(new JLabel("months"));
topPanel.add(tempPanel, gc);
gc.gridy = 2;
tempPanel = new JPanel();
tempPanel.add(new JTextField(8));
tempPanel.add(new JLabel("% per year"));
topPanel.add(tempPanel, gc);
gc.gridy = 3;
tempPanel = new JPanel();
tempPanel.add(new JComboBox());
tempPanel.add(new JComboBox());
tempPanel.add(new JComboBox());
topPanel.add(tempPanel, gc);
gc.gridy = 4;
tempPanel = new JPanel();
tempPanel.add(new JLabel("$"));
tempPanel.add(new JTextField(8));
topPanel.add(tempPanel, gc);
// Bottom
JPanel bottomPanel = new JPanel();
bottomPanel.add(new JLabel("BottomPanel"));
// Main
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
mainPanel.add(new JLabel("Mortgage Calculator"));
mainPanel.add(new JSeparator());
mainPanel.add(topPanel);
mainPanel.add(new JSeparator());
mainPanel.add(bottomPanel);
getContentPane().add(mainPanel);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}

要回答你的具体疑虑:
gc.anchor = GridBagConstraints.LINE_START;,它将所有东西按照您的意愿对齐。gc.gridwidth = GridBagConstraints.REMAINDER;意味着它应该跨越(填充)其右侧的其余列,而行gc.anchor = GridBagConstraints.CENTER;则将其对齐到中心。我留下所有的视觉效果(颜色,字体,垫子,镶嵌等等)。敬你。
https://stackoverflow.com/questions/29759943
复制相似问题