我有3个JPanel
个组件。面板1设置为BorderLayout.NORTH
,面板2设置为BorderLayout.CENTER
,面板3设置为BorderLayout.SOUTH
。
现在,面板1有GridLayout(1,2)
,面板2也有GridLayout(1,2)
。
困扰我的是在面板1和面板2中,组件对齐,好像它们在GridLayout
组合在一起。
具体来说,我在面板1中有一组JTextField
个组件,位于行= 0和列= 1。
我的JTable
位于JScrollPane
内,位置为第0行,第{2}位于第2位。
无论我尝试什么,这些组件都以相同的尺寸呈现。
代码太长了,无法在此发布,如果有人能够澄清如何从概念上解决这个问题,我将不胜感激。
public class PanelTest extends JFrame{
public static void main (String args[]) {
new PanelTest();
}
public PanelTest() {
this.setPreferredSize(new Dimension(800,200));
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(1,2));
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(1,2));
JTextField textField1 = new JTextField();
textField1.setPreferredSize(new Dimension(500, 100));
JTextField textField2 = new JTextField();
textField2.setPreferredSize(new Dimension(300, 100));
panel1.setMinimumSize(new Dimension(800, 100));
panel1.add(textField1);
panel1.add(textField2);
JTable table = new JTable();
//...
JScrollPane jps1 = new JScrollPane(table);
jps1.setPreferredSize(new Dimension(200, 300));
JTextField textField3 = new JTextField(10);
JScrollPane jps2 = new JScrollPane(textField3);
panel2.add(jps1);
panel2.add(jps2);
setLayout(new BorderLayout());
add(panel1, BorderLayout.NORTH);
add(panel2, BorderLayout.SOUTH);
this.setVisible(true);
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
使用GridBagLayout:
public PanelTest() {
this.setPreferredSize(new Dimension(800,200));
this.setMinimumSize(new Dimension(800,200));
JPanel panel1 = new JPanel();
panel1.setLayout(new GridBagLayout());
JPanel panel2 = new JPanel();
panel2.setLayout(new GridBagLayout());
JTextField textField1 = new JTextField();
textField1.setPreferredSize(new Dimension(500, 100));
JTextField textField2 = new JTextField();
textField2.setPreferredSize(new Dimension(300, 100));
panel1.setMinimumSize(new Dimension(800, 100));
GridBagConstraints gbc = new GridBagConstraints();
// gbc.insets = new Insets(5,100,5,1);
gbc.gridx=0;
gbc.gridy=0;
panel1.add(textField1, gbc);
gbc.gridx=1;
panel1.add(textField2, gbc);
JTable table = new JTable();
//...
JScrollPane jps1 = new JScrollPane(table);
jps1.setPreferredSize(new Dimension(600, 300));
jps1.setMinimumSize(new Dimension(600, 300));
JTextField textField3 = new JTextField();
gbc = new GridBagConstraints();
// gbc.insets = new Insets(5,100,5,1);
gbc.gridx=0;
gbc.gridy=0;
panel2.add(jps1, gbc);
gbc.gridx=1;
panel2.add(textField3, gbc);
setLayout(new BorderLayout());
add(panel1, BorderLayout.NORTH);
add(panel2, BorderLayout.SOUTH);
this.setVisible(true);
this.setVisible(true);
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
答案 0 :(得分:1)
困扰我的是在面板1和面板2中,组件对齐,就好像它们在GridLayout组合中一样。
来自Java docs:
GridLayout simply makes a bunch of components equal in size and displays them in the requested number of rows and columns.
“它会以相同的大小显示它们”,所以,如果你有2列并且JFrame
的大小是900px,那么你将拥有2个450px的组件,如果你有3个,那么它将是3个组件,每个300px。
这就是为什么你应该avoid the use of setPreferred|maximum|minimum size methods并让布局管理器为你选择尺寸,或者如果你真的需要一个固定的尺寸,你应该覆盖{@ 1}}尺寸,正如@trashgod所说的那样。答案。
您可能希望使用GridBagLayout
代替Layout Manager或其他FlowLayout,例如BoxLayout或avoid extending JFrame
并将它们合并。
由于你没有发布用户界面的外观,我可以想象你想要这样的东西:
{{3}}
使用以下代码完成:
getPreferred|maximum|minimum