所以我使用GridBagLayout作为我的GUI,我遇到了一些问题,没有正确调整大小。在任何人建议替代布局之前,我很肯定我想使用GridBagLayout;我将有大量的组件,我想正确地布局它们,当前的代码/图像只显示我现在所拥有的。
无论如何,问题是它没有正确调整自身大小。我希望它在调整大小时保持当前的宽高比,但事实并非如此。某些面板在调整大小时会被赋予某种优先级,这样当我调整大小时,它会破坏纵横比。基本上,我有一些面板比另一个更大,但在调整大小后,它变得比另一个小,如下:
现在,我真正想要的是让他们保持已经呈现的比例。正如您所看到的,我希望GUI的聊天部分小于左侧面板中的任何一个,就像它最初一样。
以下是我现在制作的代码:
jpPack = new JPanel();
jpCards = new JPanel();
jpInfo = new JPanel();
jpChat = new JPanel();
jpPack.setBackground(Color.red);
jpCards.setBackground(Color.blue);
jpInfo.setBackground(Color.green);
//create the Constraints and set some that will apply to each panel
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
//set the number of columns/rows to use
c.gridwidth = 1;
c.gridheight = 1;
//set the x and y position
c.gridx = 0;
c.gridy = 0;
//set the weight properties
c.weightx = 1.0;
c.weighty = 1.0;
getContentPane().add(jpCards, c);
//set the number of columns/rows to use
c.gridwidth = 1;
c.gridheight = 1;
//set the x and y position
c.gridx = 0;
c.gridy = 1;
//set the weight properties
c.weightx = 1.0;
c.weighty = 1.0;
getContentPane().add(jpPack, c);
//set the number of columns/rows to use
c.gridwidth = 1;
c.gridheight = 1;
//set the x and y position
c.gridx = 1;
c.gridy = 0;
//set the weight properties
c.weightx = 0.2;
c.weighty = 0.2;
getContentPane().add(jpInfo, c);
//set the number of columns/rows to use
c.gridwidth = 1;
c.gridheight = 1;
//set the x and y position
c.gridx = 1;
c.gridy = 1;
//set the weight properties
c.weightx = 0.2;
c.weighty = 0.2;
getContentPane().add(jpChat, c);
jpChat.setLayout(new GridLayout());
jpChat.add(client.gui.getContentPane(), c);
setVisible(true);
虽然我在这,但我也可以问我的其他问题。我想为整个GUI和聊天面板设置最小大小限制。对于第一个,我希望它禁止用户将其大小调整为小于某个x和某个y。对于后者,我希望它保持我所说的我想要的宽高比,然后在我达到两个右面板的最小值之后调整左侧面板的大小。也就是说,它会调整每个面板的大小,直到调整大小,然后继续调整整个GUI的大小,但只需调整左侧面板的大小,使右面板保持最小尺寸。
感谢您帮助我。这真是让我烦恼,我花了几个小时试图做到这一点,乱搞GridBagLayoutConstraints并没有得到任何地方。这是我得到的最好的。
答案 0 :(得分:3)
我试着在你的问题上稍作一点,我的理由很简单,这可能会引起你的担忧。您在ChatPanel
中使用的 JTextField ,在初始化时,您必须为其指定列,这可能会导致此类影响。从我制作上述代码的方式来看,这件事在任何意义上都没有给我任何奇怪的行为。虽然关于你的第二个问题,@ jackopatra,已经给出了一些见解。这是我使用的代码:
import java.awt.*;
import javax.swing.*;
public class ClientGrid
{
private void displayGUI()
{
JFrame frame = new JFrame("Client Grid");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new GridBagLayout());
JPanel bluePanel = new JPanel();
bluePanel.setOpaque(true);
bluePanel.setBackground(Color.BLUE);
JPanel greenPanel = new JPanel();
greenPanel.setOpaque(true);
greenPanel.setBackground(Color.GREEN);
JPanel redPanel = new JPanel();
redPanel.setOpaque(true);
redPanel.setBackground(Color.RED);
JPanel chatPanel = new JPanel();
JTextField chatField = new JTextField();
chatPanel.setLayout(new BorderLayout(5, 5));
chatPanel.add(chatField, BorderLayout.PAGE_START);
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.7;
gbc.weighty = 0.3;
contentPane.add(bluePanel, gbc);
gbc.gridx = 1;
gbc.weightx = 0.3;
contentPane.add(greenPanel, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 0.7;
gbc.weighty = 0.7;
contentPane.add(redPanel, gbc);
gbc.gridx = 1;
gbc.weightx = 0.3;
contentPane.add(chatPanel, gbc);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new ClientGrid().displayGUI();
}
});
}
}