我很难为我的JDialog选择正确的布局。我想在每一行都有一个组件,在它之前有一个标签。
我试图设置面板的布局为空,然后使用setBounds,但它只是太混乱(特别是我的第一个gui代码)。
我也尝试了GridLayout(上面指定的尺寸),但仍然没有得到预期的布局(我在每一行得到一个组件,没有它的标签)。
下面是我的JDialog和它的父框架的示例代码:public class Test {
private JDialog dialogTest;
private JPanel dialogTestPane;
private JPanel buttonDialogPane;
private JPanel okCancelPane;
private JTextField aTextField;
private JLabel textLabel;
private JLabel buttonLabel;
private JButton buttonTest;
private JButton buttonDialog;
private JButton buttonOk;
private JButton buttonCancel;
private JFrame testFrame;
public Test(){
createMainFrame();
}
private void createDialog(){
//Set jdialog
dialogTest = new JDialog();
dialogTest.setLayout(new BorderLayout());
dialogTestPane = new JPanel();
//dialogTestPane.setLayout(null);
dialogTestPane.setLayout(new GridLayout(5,5,5,5));
textLabel = new JLabel("Text:");
//textLabel.setBounds(10,20,46,16);
dialogTestPane.add(textLabel);
aTextField = new JTextField();
// aTextField.setBounds(70,20,80,45);
dialogTestPane.add(aTextField);
buttonLabel = new JLabel("Button:");
// buttonLabel.setBounds(10,60,46,16);
dialogTestPane.add(buttonLabel);
buttonTest = new JButton("Test");
//buttonTest.setLocation(70,60);
dialogTestPane.add(buttonTest);
dialogTest.add(dialogTestPane, BorderLayout.CENTER);
//Ok,cancel buttons
okCancelPane = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonOk = new JButton("Ok");
buttonCancel = new JButton("Cancel");
okCancelPane.add(buttonOk);
okCancelPane.add(buttonCancel);
dialogTest.add(okCancelPane, BorderLayout.SOUTH);
dialogTest.setVisible(true);
}
private void createMainFrame(){
//Set frame of buttonTest -> No layout issues here
testFrame = new JFrame();
buttonDialogPane = new JPanel(new FlowLayout());
buttonDialog = new JButton("Get Dialog");
buttonDialogPane.add(buttonDialog);
testFrame.add(buttonDialogPane);
//Showing Dialog
buttonDialog.addActionListener((ActionEvent ae) -> {
createDialog();
});
testFrame.setVisible(true);
}
}
Main类
public class TestMain {
public static void main(String[] args){
Test test = new Test();
}
}
任何帮助将不胜感激!
有很多方法可以做你想做的事情,所以我将介绍我喜欢的方法。我使用的是GroupLayout,你可以在这里了解更多:如何使用GroupLayout
实施首先创建组件
dialogTestPane = new JPanel();
textLabel = new JLabel("Text:");
aTextField = new JTextField();
buttonLabel = new JLabel("Button:");
buttonTest = new JButton("Test");
那么你必须创建GroupLayout并将其设置为JPanel()
GroupLayout groupLayout = new GroupLayout(dialogTestPane);
groupLayout.setAutoCreateGaps(true);
dialogTestPane.setLayout(groupLayout);
现在你设置水平组,在你的例子中,这意味着你创建了两个组,一个用于标签,另一个用于组件。
groupLayout.setHorizontalGroup(groupLayout.createSequentialGroup()
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(textLabel)
.addComponent(buttonLabel))
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(aTextField)
.addComponent(buttonTest)));
下一步是设置垂直组,这意味着你为每个标签和组件创建组。
groupLayout.setVerticalGroup(groupLayout.createSequentialGroup()
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(textLabel)
.addComponent(aTextField))
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(buttonLabel)
.addComponent(buttonTest)));
最后你要把JPanel添加到superior
dialogTest.add(dialogTestPane);
就是这样!对于更大数量的组件,我建议将标签和组件保持在数组中,并在循环中设置组布局,以避免数百行仅用于设置布局。
它可以通过其他方式完成,例如使用MiGLayout或混合其他布局管理器。有用链接:
- 使用布局管理器
- MiGLayout