在 Java 中使用 GridBagLayout 时防止 Swing 组件偏离中心
Preventing Swing Components from Becoming Off-Centered when using GridBagLayout in Java
我正在尝试使用 Java 中的 Swing 组件制作一个简单的 GUI。但是,由于其他组件的尺寸,某些组件会偏离中心。我正在使用 GridBagConstraints.CENTER 使这些组件居中,但似乎仅相对于它们包含在其中的网格单元格使它们居中。
我遇到的具体问题如下图所示。我需要 "File Name:" 旁边的 JTextField 有一定的长度。但是当我把它做成一定长度时,它会导致其他行中的其他组件变得偏心。保持所有组件居中的唯一方法似乎是让两个 JTextFields 的长度相同。
总的来说,我对 Swing 和 Java GUI 有点陌生,所以我可能遗漏了一些基本概念,但我还没有从我的搜索中找到这个特定问题的答案。
Image Showing the Components becoming Off-Centered when the JTextField length changes
>
//Initialize global Swing objects
JFrame frame = new JFrame("Game Server V2.0 build 019827427");
JPanel panel = new JPanel();
JButton runButton = new JButton("Start Server");
JButton stopButton = new JButton("Stop Server");
JButton sendButton = new JButton("Send File");
JTextField portField = new JTextField("999", 5);
JTextField fileField = new JTextField("fileToSend.txt", 14);
JLabel portLabel = new JLabel("Port: ");
JLabel fileLabel = new JLabel("File Name: ");
JLabel statusLabel = new JLabel("Status: Disconnected");
public void run(){
//Set layout and constraints
panel.setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
//Add Swing components to panel using GridBagLayout with the GridBagConstraints we've specified
gc.weightx = 0.5;
gc.weighty = 0.5;
gc.gridx = 0;
gc.gridy = 0;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_END;
panel.add(portLabel, gc);
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_START;
panel.add(portField, gc);
gc.gridx = 0;
gc.gridy = 1;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_END;
panel.add(fileLabel, gc);
gc.gridx = 1;
gc.gridy = 1;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_START;
panel.add(fileField, gc);
gc.gridx = 0;
gc.gridy = 2;
gc.gridwidth = 2;
gc.anchor = GridBagConstraints.CENTER;
panel.add(sendButton, gc);
gc.gridx = 0;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(runButton, gc);
gc.gridx = 1;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(stopButton, gc);
gc.gridx = 0;
gc.gridy = 4;
gc.gridwidth = 2;
panel.add(statusLabel, gc);
frame.add(panel);
frame.setSize(480, 280);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
如果 gbc.fill
是 None
,gbc.gridweightx
和 gbc.gridweighty
没有意义。只有字段应该接收额外的 space (fill == HORIZONTAL and weightx != 0
)
I guess what I'm really wanting is for both columns of cells to be of equal width,
那么您应该将 "Start" 和 "Stop" 按钮放在它们自己的列中。 Then 应该有一个 1.0 的 weightx 以允许 then 扩展。它们应该居中。
注意:它们不会完全居中,因为开始按钮的宽度会比停止按钮稍大,所以它会有一些额外的像素 space。
对于所有其他数据行,您需要向每一行添加一个组件。然后每个组件都需要 gridwidth 为 2。每个组件都将居中。由于前两行包含两个组件,因此您需要创建一个面板并将组件添加到面板中。然后使用 GridBagLayout 将面板添加到面板。
我正在尝试使用 Java 中的 Swing 组件制作一个简单的 GUI。但是,由于其他组件的尺寸,某些组件会偏离中心。我正在使用 GridBagConstraints.CENTER 使这些组件居中,但似乎仅相对于它们包含在其中的网格单元格使它们居中。
我遇到的具体问题如下图所示。我需要 "File Name:" 旁边的 JTextField 有一定的长度。但是当我把它做成一定长度时,它会导致其他行中的其他组件变得偏心。保持所有组件居中的唯一方法似乎是让两个 JTextFields 的长度相同。
总的来说,我对 Swing 和 Java GUI 有点陌生,所以我可能遗漏了一些基本概念,但我还没有从我的搜索中找到这个特定问题的答案。
Image Showing the Components becoming Off-Centered when the JTextField length changes
//Initialize global Swing objects
JFrame frame = new JFrame("Game Server V2.0 build 019827427");
JPanel panel = new JPanel();
JButton runButton = new JButton("Start Server");
JButton stopButton = new JButton("Stop Server");
JButton sendButton = new JButton("Send File");
JTextField portField = new JTextField("999", 5);
JTextField fileField = new JTextField("fileToSend.txt", 14);
JLabel portLabel = new JLabel("Port: ");
JLabel fileLabel = new JLabel("File Name: ");
JLabel statusLabel = new JLabel("Status: Disconnected");
public void run(){
//Set layout and constraints
panel.setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
//Add Swing components to panel using GridBagLayout with the GridBagConstraints we've specified
gc.weightx = 0.5;
gc.weighty = 0.5;
gc.gridx = 0;
gc.gridy = 0;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_END;
panel.add(portLabel, gc);
gc.gridx = 1;
gc.gridy = 0;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_START;
panel.add(portField, gc);
gc.gridx = 0;
gc.gridy = 1;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_END;
panel.add(fileLabel, gc);
gc.gridx = 1;
gc.gridy = 1;
gc.gridwidth = 1;
gc.anchor = GridBagConstraints.LINE_START;
panel.add(fileField, gc);
gc.gridx = 0;
gc.gridy = 2;
gc.gridwidth = 2;
gc.anchor = GridBagConstraints.CENTER;
panel.add(sendButton, gc);
gc.gridx = 0;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(runButton, gc);
gc.gridx = 1;
gc.gridy = 3;
gc.gridwidth = 1;
panel.add(stopButton, gc);
gc.gridx = 0;
gc.gridy = 4;
gc.gridwidth = 2;
panel.add(statusLabel, gc);
frame.add(panel);
frame.setSize(480, 280);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
gbc.fill
是 None
,gbc.gridweightx
和 gbc.gridweighty
没有意义。只有字段应该接收额外的 space (fill == HORIZONTAL and weightx != 0
)
I guess what I'm really wanting is for both columns of cells to be of equal width,
那么您应该将 "Start" 和 "Stop" 按钮放在它们自己的列中。 Then 应该有一个 1.0 的 weightx 以允许 then 扩展。它们应该居中。
注意:它们不会完全居中,因为开始按钮的宽度会比停止按钮稍大,所以它会有一些额外的像素 space。
对于所有其他数据行,您需要向每一行添加一个组件。然后每个组件都需要 gridwidth 为 2。每个组件都将居中。由于前两行包含两个组件,因此您需要创建一个面板并将组件添加到面板中。然后使用 GridBagLayout 将面板添加到面板。