当使GridBagLayout管理的布局的各个组件不可见时,布局中其余组件的排列会不断变化.GridBagLayout似乎使用不可见组件"折叠"单元格,导致其他组件更改位置.这是一种非常烦人的行为,我一直在寻找一种方法来阻止它这样做.
我尝试过的一种方法是在相同的单元格中添加一个间隔符,其固定大小等于可能隐藏的组件的首选大小,但如果要改变的首选大小,则会遇到很多麻烦保持垫片同步.有没有更好的办法?
实际上,如果GridBagLayout真的完全忽略了具有不可见组件的单元格,它就不会那么糟糕了,但它仍然考虑了单元格的插图,所以如果你有一个输入字段的布局并使用插图整齐地排列它们两者之间的间隙,然后隐藏中间的一个组件将其从布局中移除但留下间隙,这通常意味着周围的组件一起流动,但它们之间有一个丑陋的双宽间隙......
我想使用GridBagLayout在两个组件之间添加一个垂直JSeparator.我的代码如下:
public MainWindowBody(){
setLayout(new GridBagLayout());
JPanel leftPanel = new InformationPanel();
JPanel rightPanel = new GameSelectionPanel();
JSeparator sep = new JSeparator(JSeparator.VERTICAL);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.NORTH;
add(leftPanel,gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.VERTICAL;
add(sep,gbc);
gbc.gridx = 2;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.NONE;
add(rightPanel,gbc);
}
Run Code Online (Sandbox Code Playgroud)
但JSeperator没有显示任何想法?
谢谢
当我尝试对齐我的组件时,它会左侧或右侧.
所以我只是希望解决方案摆脱这个问题,并告诉我如何将面板的大小设置为400 x 350像素.

这里是我的代码.... titleLabel并ResultLabel应在中心对齐
public TimeGui() {
layout = new GridBagLayout();
setSize(400, 350); //**Its not working**
setBackground(Color.LIGHT_GRAY);
setBorder(BorderFactory.createLineBorder(Color.BLACK));
setBorder(new TitledBorder(new EtchedBorder(), "Time Conversion") );
setLayout(layout);
layoutConstraints = new GridBagConstraints();
textField1 = new JTextField(10);
textField2 = new JTextField(10);
String[] names1 = {"Seconds", "Minutes", "Hours", "Days", "Weeks"};
comboBox1 = new JComboBox<>(names1);
comboBox2 = new JComboBox<>(names1);
titleLabel = new JLabel("Time Conversion Unit", JLabel.CENTER);
resultLabel = new JLabel("Result Label");
equalLabel = new JLabel("=");
convertButton = new JButton("Convert");
layoutConstraints.fill = …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试创建一组切换按钮,这些按钮类似于Eclipse的格式化程序首选项中使用的按钮:

目前我已通过以下方式尝试此操作:
public class Exercise extends JFrame {
private String[] buttonNames = {"A", "B", "C", "D", "E"};
Exercise() {
final JPanel topPanel = new JPanel();
topPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
int tabCount = 0;
final ButtonGroup topButtonGroup = new ButtonGroup();
for (String buttonName : buttonNames) {
JToggleButton tabButton = new JToggleButton(buttonName);
topButtonGroup.add(tabButton);
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(0, -6, 0, -7); // Questionable line
c.gridx = tabCount;
c.gridy = 0;
topPanel.add(tabButton, c);
tabCount++;
}
this.add(topPanel);
this.setVisible(true);
this.pack(); …Run Code Online (Sandbox Code Playgroud) 学习GridBagLayout,这里的问题是,名称标签和combox没有显示在面板的顶部,但我已将其锚点设置为NORTH.为什么?
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class Test2 {
public Test2() {
JFrame frame = new JFrame();
frame.setTitle("test");
frame.getContentPane().setLayout(new GridLayout(1,2));
frame.setSize(800, 600);
JPanel panel1 = new JPanel();
panel1.setLayout(new GridBagLayout());
JLabel label = new JLabel("name");
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.anchor = GridBagConstraints.NORTH;
gridBagConstraints.weightx = 0.0;
gridBagConstraints.weighty = 0.0;
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
panel1.add(label, gridBagConstraints);
String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
JComboBox petList …Run Code Online (Sandbox Code Playgroud) 当我将其中一个子面板设置为不可见时,如何使主面板中的子面板保持原样?
我看起来像:
[ (Panel1) (Panel2) (Panel3) (Panel4) ]
Run Code Online (Sandbox Code Playgroud)
当我这样做panel3.setVisible(false),然后看起来像:
[ (Panel1) (Panel2) (Panel4) ]
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像:
[ (Panel1) (Panel2) (Panel4) ]
Run Code Online (Sandbox Code Playgroud)
我正在使用GridBagLayout,我的mainPanel声明如下所示:
final JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
Run Code Online (Sandbox Code Playgroud)
我添加了一个新的面板,如:
final JTextField valueTextField = new JTextField();
valueTextField.setPreferredSize(new Dimension(80, 25));
valueTextField.setName("Value");
c.gridx =0;
panel.add(valueTextField, c);
Run Code Online (Sandbox Code Playgroud)
如果需要我会提供更多代码,我不关心我使用哪种布局,只要它能得到我想要的东西.
我有两个JButton文本"Ok"和"Cancel".我用它GridBagLayout来对齐它们JDialog.我把锚设置为GridBagConstraints.CENTER.由于文本"Ok"和"Cancel"中字符数的不同,按钮的大小不同.如何正确对齐它们,使它们每个都具有相同的大小.我试过以下但没有用.
okayButton.setSize(cancelButton.getSize());
Run Code Online (Sandbox Code Playgroud) 我是Java编程的新手,我正在尝试创建一个包含两个按钮和一个文本区域的窗口,如下图所示.我遇到的问题是定位组件.我尝试使用GridLayout并将窗口分成9行和16个单元格,但后来发现我无法使组件占用多于一个单元格.我知道我应该使用,GridBagLayout但我不知道究竟是怎么回事.帮助将不胜感激.:)
我的问题如下:我正在尝试使用窗口调整JScrollPane大小,水平达到一定大小,它应该停止尝试随窗口一起增长.
我可以用GridBagLayout做到吗?如果是这样,怎么样?
我一直试图在下面的代码中设置固定的列宽度...事情是,当我在左边的面板上添加标签时,宽度会自动增加...我希望列宽度要固定......
有人可以帮我吗?
这是代码:
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import …Run Code Online (Sandbox Code Playgroud)