多个组件的复杂布局
我正在设计一个图形用户界面,其中我有如下所示的组件。但在第二行,我想管理组件之间的空间。例如,在第二行中,我希望同时适合JLabel
"移动到时间"和JTextField
,而没有太多的间距。正如我所看到的,现在MigLayout
将JTextField
与第一行中的第二个组件放在一起。然后,第二行中的JButton
"移动"应与第一行中的第二个组件对齐。我如何实现这一点?以下是我的代码。我在MigLayout
上查找了许多小抄和快速入门指南,但我还不能做到。有人能建议对我的代码片段进行修改吗?谢谢。
`
JPanel helper = new JPanel( new MigLayout( "" ) );
helper.add( new JButton( "Add puncta coordinates from CSV" ), "width 250:20" );
helper.add( new JButton( "Add track coordinates from CSV" ), "wrap" );
helper.add( new JLabel( "Move to time:" ) );
JTextField tMoveTime = new JTextField();
helper.add( tMoveTime, " gap 2px, width 75:20" );
JButton bMoveTime = initMoveButton();
helper.add( bMoveTime, "width 75:20" );
`
实际上,我打算完整地制作以下包含所有按钮和文本字段的图形用户界面,还有其他布局更适合吗?如果是,是否可以指向推荐布局的示例代码片段?谢谢。
解决方案
您可以考虑两种基本方法:
一种是使用高度灵活的布局管理器,如MigLayout
。我不太熟悉,但我可以推荐GridbagLayout这份工作:
JPanel helper = new JPanel( );
GridBagLayout gbl_helper = new GridBagLayout();
gbl_helper.columnWidths = new int[]{200, 7, 200, 60, 18, 0};
gbl_helper.rowHeights = new int[]{20, 20};
gbl_helper.columnWeights = new double[]{1.0, 0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_helper.rowWeights = new double[]{0.0, 0};
helper.setLayout(gbl_helper);
GridBagConstraints gbc1 = new GridBagConstraints();
gbc1.fill = GridBagConstraints.HORIZONTAL;
gbc1.gridwidth = 2;
gbc1.anchor = GridBagConstraints.NORTHWEST;
gbc1.insets = new Insets(5,5,5,5);
gbc1.gridx = 0;
gbc1.gridy = 0;
JButton button1 = new JButton( "Add puncta coordinates from CSV" );
helper.add( button1, gbc1 );
GridBagConstraints gbc2 = new GridBagConstraints();
gbc2.fill = GridBagConstraints.HORIZONTAL;
gbc2.gridwidth = 2;
gbc2.anchor = GridBagConstraints.NORTHWEST;
gbc2.insets = new Insets(5,5,5,5);
gbc2.gridx = 2;
gbc2.gridy = 0;
JButton button2 = new JButton( "Add track coordinates from CSV" );
helper.add( button2, gbc2 );
GridBagConstraints gbc3 = new GridBagConstraints();
gbc3.insets = new Insets(0, 0, 0, 5);
gbc3.gridx = 0;
gbc3.gridy = 1;
JLabel label = new JLabel( "Move to time:" );
helper.add( label, gbc3 );
JTextField tMoveTime = new JTextField();
tMoveTime.setColumns(15);
GridBagConstraints gbc4 = new GridBagConstraints();
gbc4.anchor = GridBagConstraints.WEST;
gbc4.insets = new Insets(0, 0, 0, 5);
gbc4.gridx = 1;
gbc4.gridy = 1;
helper.add( tMoveTime, gbc4);
JButton bMoveTime = new JButton("Move");
GridBagConstraints gbc5 = new GridBagConstraints();
gbc5.insets = new Insets(0, 0, 0, 5);
gbc5.anchor = GridBagConstraints.NORTHEAST;
gbc5.gridx = 3;
gbc5.gridy = 1;
helper.add( bMoveTime, gbc5 );
另一种方法是使用子面板将复杂布局划分为更简单的布局,每个子面板都有自己的布局管理器:
JPanel helper = new JPanel( );
helper.setLayout(new BoxLayout(helper, BoxLayout.Y_AXIS));
getContentPane().add(helper);
JPanel topPanel = new JPanel();
helper.add(topPanel);
JButton button1 = new JButton( "Add puncta coordinates from CSV" );
topPanel.add(button1);
JButton button2 = new JButton( "Add track coordinates from CSV" );
topPanel.add(button2);
JPanel bottomPanel = new JPanel();
helper.add(bottomPanel);
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS));
JPanel bottomRIght = new JPanel();
bottomPanel.add(bottomRIght);
JLabel label = new JLabel( "Move to time:" );
bottomRIght.add(label);
JTextField tMoveTime = new JTextField();
bottomRIght.add(tMoveTime);
tMoveTime.setColumns(15);
JPanel bottomleftPanel = new JPanel();
bottomPanel.add(bottomleftPanel);
bottomleftPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
JButton bMoveTime = new JButton("Move");
bottomleftPanel.add(bMoveTime);
相关文章