GridBagLayout Swing 中的 JSpinners 和 JButton
JSpinners and JButton in GridBagLayout Swing
这是我创建消息面板的代码:
private class MessagePane extends JPanel {
private MessagePane() {
setLayout(new GridBagLayout());
setBackground(backgroundColor);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
add(allowButton, gbc);
gbc.gridx = 1;
add(blockButton, gbc);
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.weighty = 1;
add(timerL, gbc);
gbc.fill = GridBagConstraints.BOTH;
add(new JScrollPane(messageArea), gbc);
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.gridx = 0;
add(countryList, gbc);
gbc.gridx = 1;
add(msgList, gbc);
gbc.gridx = 2;
add(sendButton, gbc);
setVisible(true);
}
}
这个视图看起来像:
我想达到的效果:
你能帮我解决这个问题吗?
您没有正确设置 gbc 约束宽度,但话虽如此,对于此 GUI,我不会使用 GridBagLayout。我会:
- 对整个 JPanel 使用 BorderLayout
- 使用 1 行 2 列的 GridLayout 将顶部按钮添加到 JPanel,中间有一些 space
- 将该 JPanel 放入主 JPanel
BorderLayout.PAGE_START
- 放置中心组件
BorderLayout.CENTER
- 使用沿线(不是页面)的 BoxLayout 为底部创建一个 JPanel
- 将其添加到主 JPanel
BorderLayout.PAGE_END
Hovercraft Full Of Eels 提出了一个很好的策略,但我希望这也可以完全使用 GBL 来完成。这只是让每一行的列跨度正确的问题。我的想法是,每行应该有 4 列宽度,用作:
- 绿色 边框区域:1 列跨度。
- 红色 边框区域:2 列跨度。
- 蓝色 边框区域:4 列跨度。
Post 如果您需要更多帮助,请提供一个可编译的示例。
我使用 GridBagLayout
创建了以下 GUI。
我必须将顶部的两个按钮放在它们自己的 JPanel 中,以便它们的大小相同。我为按钮面板和主面板都使用了 GridBagLayout
。
我为每个 Swing 组件创建了一个 GridBagConstraints
。这样,我可以按照自己的意愿设置插图,并可以为每个组件指定不同的锚点和填充。
我不得不猜测 OP 使用了哪些 Swing 组件,因为他发布的代码中没有定义这些组件。
这是生成 GUI 的完整、可运行的示例。
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerListModel;
import javax.swing.SwingUtilities;
public class MessageApplication implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new MessageApplication());
}
@Override
public void run() {
JFrame frame = new JFrame("Message Panel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MessagePanel().getPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class MessagePanel {
private JPanel panel;
public MessagePanel() {
// top, left, bottom, right
Insets topLeftInsets = new Insets(10, 10, 10, 10);
Insets topInsets = new Insets(10, 0, 10, 10);
Insets leftInsets = new Insets(0, 10, 10, 10);
Insets insets = new Insets(0, 0, 10, 10);
Insets messageInsets = new Insets(2, 4, 2, 4);
Insets zeroInsets = new Insets(0, 0, 0, 0);
panel = new JPanel();
panel.setLayout(new GridBagLayout());
int gridy = 0;
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridBagLayout());
JButton allowButton = new JButton("ALLOW");
addComponent(buttonPanel, allowButton, 0, gridy, 1, 1,
topLeftInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
JButton blockButton = new JButton("BLOCK");
addComponent(buttonPanel, blockButton, 1, gridy, 1, 1,
topInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
addComponent(panel, buttonPanel, 0, gridy++, 6, 1,
zeroInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
JTextArea messageArea = new JTextArea(12, 30);
messageArea.setEditable(false);
messageArea.setMargin(messageInsets);
messageArea.setText("I'm a message area.");
JScrollPane scrollPane =
new JScrollPane(messageArea);
addComponent(panel, scrollPane, 0, gridy++, 6, 1,
leftInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
String[] countryStrings = { "US", "CA" };
SpinnerListModel countryModel =
new SpinnerListModel(countryStrings);
JSpinner countryList = new JSpinner(countryModel);
addComponent(panel, countryList, 0, gridy, 1, 1,
leftInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
String[] msgStrings = { "Message to the client",
"Message to the shipper" };
SpinnerListModel msgModel =
new SpinnerListModel(msgStrings);
JSpinner msgList = new JSpinner(msgModel);
addComponent(panel, msgList, 1, gridy, 4, 1,
insets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
JButton sendButton = new JButton("SEND");
addComponent(panel, sendButton, 5, gridy++, 1, 1,
insets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
}
private void addComponent(Container container,
Component component, int gridx, int gridy,
int gridwidth, int gridheight, Insets insets,
int anchor, int fill) {
GridBagConstraints gbc = new GridBagConstraints(
gridx, gridy, gridwidth, gridheight,
1.0, 1.0, anchor, fill, insets, 0, 0);
container.add(component, gbc);
}
public JPanel getPanel() {
return panel;
}
}
}
这是我创建消息面板的代码:
private class MessagePane extends JPanel {
private MessagePane() {
setLayout(new GridBagLayout());
setBackground(backgroundColor);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
add(allowButton, gbc);
gbc.gridx = 1;
add(blockButton, gbc);
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.weighty = 1;
add(timerL, gbc);
gbc.fill = GridBagConstraints.BOTH;
add(new JScrollPane(messageArea), gbc);
gbc = new GridBagConstraints();
gbc.gridy = 2;
gbc.gridx = 0;
add(countryList, gbc);
gbc.gridx = 1;
add(msgList, gbc);
gbc.gridx = 2;
add(sendButton, gbc);
setVisible(true);
}
}
这个视图看起来像:
我想达到的效果:
你能帮我解决这个问题吗?
您没有正确设置 gbc 约束宽度,但话虽如此,对于此 GUI,我不会使用 GridBagLayout。我会:
- 对整个 JPanel 使用 BorderLayout
- 使用 1 行 2 列的 GridLayout 将顶部按钮添加到 JPanel,中间有一些 space
- 将该 JPanel 放入主 JPanel
BorderLayout.PAGE_START
- 放置中心组件
BorderLayout.CENTER
- 使用沿线(不是页面)的 BoxLayout 为底部创建一个 JPanel
- 将其添加到主 JPanel
BorderLayout.PAGE_END
Hovercraft Full Of Eels 提出了一个很好的策略,但我希望这也可以完全使用 GBL 来完成。这只是让每一行的列跨度正确的问题。我的想法是,每行应该有 4 列宽度,用作:
- 绿色 边框区域:1 列跨度。
- 红色 边框区域:2 列跨度。
- 蓝色 边框区域:4 列跨度。
Post 如果您需要更多帮助,请提供一个可编译的示例。
我使用 GridBagLayout
创建了以下 GUI。
我必须将顶部的两个按钮放在它们自己的 JPanel 中,以便它们的大小相同。我为按钮面板和主面板都使用了 GridBagLayout
。
我为每个 Swing 组件创建了一个 GridBagConstraints
。这样,我可以按照自己的意愿设置插图,并可以为每个组件指定不同的锚点和填充。
我不得不猜测 OP 使用了哪些 Swing 组件,因为他发布的代码中没有定义这些组件。
这是生成 GUI 的完整、可运行的示例。
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.SpinnerListModel;
import javax.swing.SwingUtilities;
public class MessageApplication implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new MessageApplication());
}
@Override
public void run() {
JFrame frame = new JFrame("Message Panel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MessagePanel().getPanel());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class MessagePanel {
private JPanel panel;
public MessagePanel() {
// top, left, bottom, right
Insets topLeftInsets = new Insets(10, 10, 10, 10);
Insets topInsets = new Insets(10, 0, 10, 10);
Insets leftInsets = new Insets(0, 10, 10, 10);
Insets insets = new Insets(0, 0, 10, 10);
Insets messageInsets = new Insets(2, 4, 2, 4);
Insets zeroInsets = new Insets(0, 0, 0, 0);
panel = new JPanel();
panel.setLayout(new GridBagLayout());
int gridy = 0;
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridBagLayout());
JButton allowButton = new JButton("ALLOW");
addComponent(buttonPanel, allowButton, 0, gridy, 1, 1,
topLeftInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
JButton blockButton = new JButton("BLOCK");
addComponent(buttonPanel, blockButton, 1, gridy, 1, 1,
topInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
addComponent(panel, buttonPanel, 0, gridy++, 6, 1,
zeroInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
JTextArea messageArea = new JTextArea(12, 30);
messageArea.setEditable(false);
messageArea.setMargin(messageInsets);
messageArea.setText("I'm a message area.");
JScrollPane scrollPane =
new JScrollPane(messageArea);
addComponent(panel, scrollPane, 0, gridy++, 6, 1,
leftInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
String[] countryStrings = { "US", "CA" };
SpinnerListModel countryModel =
new SpinnerListModel(countryStrings);
JSpinner countryList = new JSpinner(countryModel);
addComponent(panel, countryList, 0, gridy, 1, 1,
leftInsets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
String[] msgStrings = { "Message to the client",
"Message to the shipper" };
SpinnerListModel msgModel =
new SpinnerListModel(msgStrings);
JSpinner msgList = new JSpinner(msgModel);
addComponent(panel, msgList, 1, gridy, 4, 1,
insets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
JButton sendButton = new JButton("SEND");
addComponent(panel, sendButton, 5, gridy++, 1, 1,
insets, GridBagConstraints.CENTER,
GridBagConstraints.HORIZONTAL);
}
private void addComponent(Container container,
Component component, int gridx, int gridy,
int gridwidth, int gridheight, Insets insets,
int anchor, int fill) {
GridBagConstraints gbc = new GridBagConstraints(
gridx, gridy, gridwidth, gridheight,
1.0, 1.0, anchor, fill, insets, 0, 0);
container.add(component, gbc);
}
public JPanel getPanel() {
return panel;
}
}
}