【发布时间】:2023-03-21 01:21:01
【问题描述】:
我正在尝试创建以下 GUI:
但我制作的 GUI 是:
我的网格是什么样子的:
我不明白为什么我会得到这个输出,因为我已经绘制了一个图表来帮助代码并且它似乎可以解决。
addCompadd 方法将输入组件添加到输入面板中给定的 (x, y) 位置和给定的组件宽度和高度。
代码:
import javax.swing.*;
import java.awt.*;
public class GUIError extends JFrame {
//initialise all the components
JPanel mainPanel = new JPanel();
JTextField txtDisplay = new JTextField();
JButton btnA = new JButton("A");
JButton btnB = new JButton("B");
JButton btnC = new JButton("C");
JButton btnD = new JButton("D");
JButton btnE = new JButton("E");
JButton btnF = new JButton("F");
JButton btnWA = new JButton("WA");
JButton btnWB = new JButton("WB");
JButton btnWC = new JButton("WC");
JButton btnWD = new JButton("WD");
private void addComp(JPanel panel, JComponent comp, int xPos, int yPos, int compWidth, int compHeight) {
GridBagConstraints gridConstraints = new GridBagConstraints();
gridConstraints.gridx = xPos;
gridConstraints.gridy = yPos;
gridConstraints.gridwidth = compWidth;
gridConstraints.gridheight = compHeight;
gridConstraints.weightx = 0.5;
gridConstraints.weighty = 0.5;
gridConstraints.insets = new Insets(5, 5, 5, 5);
gridConstraints.anchor = GridBagConstraints.CENTER;
gridConstraints.fill = GridBagConstraints.BOTH;
panel.add(comp, gridConstraints);
}
public static void main(String[] args) {
try {
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (Exception e) { }
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// create frame
JFrame frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationRelativeTo(null);
Container c = frame.getContentPane();
// create GUI within frame
new GUIError(c);
// finish frame definition
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
});
}
public GUIError(Container cont) {
cont.setPreferredSize(new Dimension(610, 250));
// parent panel containes every other panel
mainPanel.setLayout(new GridBagLayout());
// text display
txtDisplay.setEditable(false);
addComp(mainPanel, txtDisplay, 0, 0, 12, 2); // width 16, height 2
addComp(mainPanel, btnA, 0, 2, 2, 1);
addComp(mainPanel, btnB, 2, 2, 2, 1);
addComp(mainPanel, btnC, 4, 2, 2, 1);
addComp(mainPanel, btnD, 6, 2, 2, 1);
addComp(mainPanel, btnE, 8, 2, 2, 1);
addComp(mainPanel, btnF, 10, 2, 2, 1);
addComp(mainPanel, btnWA, 0, 3, 3, 1);
addComp(mainPanel, btnWB, 3, 3, 3, 1);
addComp(mainPanel, btnWC, 6, 3, 3, 1);
addComp(mainPanel, btnWD, 9, 3, 3, 1);
cont.add(mainPanel);
}
}
【问题讨论】:
-
GBC 是基于列的,+1 表示问题和 SSCCE/MCVE,开发 MigLayout (e.i.) 的原因
-
不要以为只用 1 个面板就可以做到这一点。据我所知,
gridwidth无法指定“半个网格”。我认为最好的选择是使用不同的布局,或者将您的组件分成不同的面板(主面板在顶部包含一个字段,在下面包含 2 个面板(并排)。每个子面板有 2 个面板:一个用于 3较小的按钮,一个下面有 2 个较大的按钮) -
我没有使用gridwidth指定半个网格。第一行按钮是gridwidth = 2,第三行按钮是gridwidth = 3。我不明白你说的底部3个小按钮和2个大按钮是什么意思?我还链接的网格显示了我在这种情况下使用的网格。第二排按钮大小相同,第三排按钮大小相同。我不明白为什么这不适用于 GridBagLayout。
-
@user3749872 查看你要的结果;您希望
WA和WB占用与其他 3 个按钮相同的空间。正如您所获得的结果所见,您的组件似乎已锁定到位(与其他所有组件对齐)。由于您的小按钮,您有 6 个网格空间;您希望WA占用下面网格空间的 1 1/2,而WB占用另外 1 1/2(与 WC 和 WD 相同)。在代码中,您没有尝试占用半个网格,但您要求的结果需要它。这可以通过切换布局或用面板分隔来完成 -
我将发布一个解释的答案以及解决方案。给我一秒钟
标签: java swing layout layout-manager gridbaglayout