我需要为我的学校作业手动编写所有GUI代码。我正在使用Java并使用GridBagLayout。我读到重用相同的GridBagConstraint实例并且每个组件都拥有它自己的GridBagConstraint实例并不是一个好主意。因此,如果每个组件都有自己的组件,我为每个组件指定填充,位置和插入,这样就可以为GUI创建大量代码。
这个特殊的任务我将在BorderLayout中有一个主窗格,另外两个窗格将位于其中。一个是另一个BorderLayout,它只是输出信息的显示区域,另一个是标签,文本字段和按钮,供用户选择多个用于输入的文件。我已将其分解并将每个窗格的所有代码放在其自己的JComponent实例中(不确定这是否是正确的术语)。所以代码看起来像:
protected JComponent inputPaneComponent() {
all code for the inputPane goes here
}
但就像我上面描述的那样,使用多个GridBagConstraints,每个组件的细节都会产生一长串代码。我是否应该将每个组件之间的空行分开,或者在每个组件上方放置注释行,说明我正在使用哪个组件?或者只是一大堆线?
这只是我尚未完成编码的一个示例。像这样:
protected JComponent inputPaneComponent() {
JPanel inputPane = new JPanel();
inputPane.setLayout(new GridBagLayout());
inputPane.setBorder(BorderFactory.createTitledBorder("Input Files:"));
GridBagConstraints c0 = new GridBagConstraints();
c0.fill = GridBagConstraints.HORIZONTAL;
c0.gridx = 0;
c0.gridy = 0;
c0.insets = new Insets(10, 10, 0, 0);
inputPane.add(nameLabel, c0);
GridBagConstraints c1 = new GridBagConstraints();
c1.fill = GridBagConstraints.HORIZONTAL;
c1.gridx = 1;
c1.gridy = 0;
c1.insets = new Insets(10, 10, 0, 0);
inputPane.add(nameFileTextField, c1);
GridBagConstraints c2 = new GridBagConstraints();
c2.fill = GridBagConstraints.HORIZONTAL;
c2.gridx = 2;
c2.gridy = 0;
c2.insets = new Insets(10, 10, 0, 0);
inputPane.add(nameFileButton, c2);
return inputPane;
}
或者这个:
protected JComponent inputPaneComponent() {
// Set title, layout, and exit condition.
JPanel inputPane = new JPanel();
inputPane.setLayout(new GridBagLayout());
inputPane.setBorder(BorderFactory.createTitledBorder("Input Files:"));
// Create and configure name label.
JLabel nameLabel = new JLabel("Names File:");
GridBagConstraints c0 = new GridBagConstraints();
c0.fill = GridBagConstraints.HORIZONTAL;
c0.gridx = 0;
c0.gridy = 0;
c0.insets = new Insets(10, 10, 0, 0);
inputPane.add(nameLabel, c0);
// Create and configure name file textfield.
JTextField nameFileTextField = new JTextField(60);
GridBagConstraints c1 = new GridBagConstraints();
c1.fill = GridBagConstraints.HORIZONTAL;
c1.gridx = 1;
c1.gridy = 0;
c1.insets = new Insets(10, 10, 0, 0);
inputPane.add(nameFileTextField, c1);
// Create and configure name file button.
JButton nameFileButton = new JButton("Browse");
GridBagConstraints c2 = new GridBagConstraints();
c2.fill = GridBagConstraints.HORIZONTAL;
c2.gridx = 2;
c2.gridy = 0;
c2.insets = new Insets(10, 10, 0, 0);
inputPane.add(nameFileButton, c2);
return inputPane;
}
我更喜欢后者,对我来说它更容易阅读,但它确实增加了长度,而且我没有经验,并且想知道标准可能是什么。
感谢您的帮助,我希望我能参与此论坛的规则,这是我在这里的第一篇文章。
马特
答案 0 :(得分:1)
首先......不,除了使用生成低级布局代码的设计器工具 1 之外,没有标准或事实标准。 (你被告知不要这样做。)
但是,有一些方法可以让你的任务不那么痛苦:
GridBagConstraint
对象在合并到GridBagLayout
时被克隆。这意味着您可以重用相同的GridBagConstraint
对象,对其进行增量更改。
有些第三方库为GridBagConstraint
个对象提供了“构建器”,旨在使构造更简洁。
阅读此Q& A了解更多信息:
1 - 使用设计器工具的陷阱是您“锁定”使用特定工具。这很好......直到工具供应商停止支持它。另一个问题是,您可能会发现需要为运行时许可支付高昂的费用才能分发/销售您的产品。 (我已经看到一个杀了一个好项目,死了!)
答案 1 :(得分:-1)
我建议你重构你的代码,因为一般来说,冗长的方法是不容易支持/维护的,所以你需要refactor
你的冗长方法进一步使用有意义名称的小方法,这样你就可以避免注释以及方法名称变得不言自明,它们变得更易读/可理解。
您可以参考以下方法,我将您的一些代码重构为以下内容:
private GridBagConstraints populateNameLabel(JLabel nameLabel) {
//populate the data here and return
}
private GridBagConstraints populateTextField(JTextField nameFileTextField) {
//populate the data here and return
}
private GridBagConstraints populateFileButton(JButton nameFileButton) {
//populate the data here and return
}
您需要在原始方法中使用这些方法,以便代码更具可支持性/可读性。