对于我的CSE 205(Java编程2)类,我们必须设计一个非常简单的GUI小程序。我对Swing非常熟悉,我已经将它用于我自己的一些项目。我设计的程序几乎没有问题,从Eclipse运行时,它在我的计算机上看起来很完美:
但是当我在网上提交它,它在浏览器中运行时,UI会严重痴迷,返回默认值:
由于它很简单,我已经习惯使用GridBagLayout。这就是我在这里使用的。 CreatePanel和SelectPanel类(如第一张图片中所示)都扩展了JPanel(根据我的教授)。我用每个设置:
this.setLayout(new GridBagLayout());
以及每个组件:
//Call the method addItem() to add the create button to the panel
addItem(this, createB,0,2,2,1,defaultInset,GridBagConstraints.CENTER);
//-------
public void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int[] inset, int align)
{
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = x;
gc.gridy = y;
gc.gridwidth = width;
gc.gridheight = height;
gc.weightx = 0;
gc.weighty = 0;
gc.insets = new Insets(inset[0],inset[1],inset[2],inset[3]);
gc.anchor = align;
gc.fill = GridBagConstraints.NONE;
p.add(c, gc);
}
任何人都对可能发生的事情有任何想法?考虑到超过一半的时间花在让布局看起来正确,我想要一个简单的修复。如果需要,我可以发布更多代码。感谢您的任何建议。
- 编辑 -
好吧我根据@MadProgrammer的建议做了一些游戏。我想我已经缩小了问题的范围。
这是我用来将JTextField的大小设置为标签“输入宠物类型:
右侧的代码petTypeTF = new JTextField("");
petTypeTF.setPreferredSize(new Dimension(125, 60));
现在,如果我将代码更改为其他任何内容,例如设置列数:
petTypeTF = new JTextField("",12);
petTypeTF.setPreferredSize(new Dimension(125, 60));
我获得的UI看起来与我在线提交时的UI相同。与设置列数有关的事情似乎搞砸了。这有助于缩小任何人的范围吗?
答案 0 :(得分:9)
确实没有足够的代码来确定问题的完整范围,但是一些想法可能有所帮助。
如果可能的话, GridBagLayout
会尝试根据首选大小来设置它的组件。如果它不能,它会看到最小尺寸。
确保使用列(以及文本区域)行创建文本组件。这将根据许多重要因素自动确定组件的首选大小。
public class BadLayout11 {
public static void main(String[] args) {
new BadLayout11();
}
public BadLayout11() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JTabbedPane pane = new JTabbedPane();
pane.add("Pet List Creation", new TestPane());
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
JPanel fields = new JPanel(new GridBagLayout());
JTextField field = new JTextField(12);
JTextArea area = new JTextArea(10, 20);
JLabel label = new JLabel("Enter a Pet Type");
JButton button = new JButton("Create a Pet");
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.anchor = GridBagConstraints.WEST;
fields.add(label, gbc);
gbc.weightx = 1;
gbc.gridx++;
fields.add(field, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = 0;
gbc.weightx = 0;
gbc.gridy++;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.CENTER;
fields.add(button, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridheight = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;
add(fields, gbc);
gbc.gridx++;
add(new JScrollPane(area), gbc);
}
}
}
不幸的是,在某些时候,一切都会达到这样的程度,即根本无法维持布局,事情会崩溃或者只是显示剪辑。
在这些情况下,您可以将整个容器放在JScrollPane
内,但在这种情况下,我认为这是最糟糕的情况。