为啥我的 UI 在浏览器中运行与在我的计算机上运行 (Java Swing) 时会丢失格式?
Posted
技术标签:
【中文标题】为啥我的 UI 在浏览器中运行与在我的计算机上运行 (Java Swing) 时会丢失格式?【英文标题】:Why does my UI lose formatting when run in-browser vs run on my computer (Java Swing)?为什么我的 UI 在浏览器中运行与在我的计算机上运行 (Java Swing) 时会丢失格式? 【发布时间】:2013-02-03 13:48:35 【问题描述】:对于我的 CSE 205(Java 编程 2)课程,我们必须设计一个非常简单的 GUI 小程序。我对 Swing 非常熟悉,之前在我自己的一些项目中使用过它。我设计的程序几乎没有问题,从 Eclipse 运行时它在我的计算机上看起来很完美:
但是当我在线提交它时,它在浏览器中运行时,用户界面变得严重失常,恢复到默认状态:
我已经习惯使用 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 相同。与设置列数有关的事情似乎搞砸了。这对任何人都有帮助吗?
【问题讨论】:
很多原因。我想这些字段不是使用默认列(在文本区域的情况下为行)创建的。可能是用于将窗格放置到选项卡上的布局管理器... 我害怕这样的事情。你有什么建议我可以试试吗? 如果没有示例可以使用,这很困难,但是...确保使用列/行值创建文本组件。使用BorderLayout
将组件放在选项卡上,并为文本区域的约束提供更好的权重
【参考方案1】:
确实没有足够的代码来确定问题的全部范围,但一些想法可能会有所帮助。
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
中,但在这种情况下,我认为这是最坏的情况。
【讨论】:
+1,您涵盖了我关于在创建文本字段时指定列和在 GrigBagLayout 上使用最小尺寸指定列的两点。以上是关于为啥我的 UI 在浏览器中运行与在我的计算机上运行 (Java Swing) 时会丢失格式?的主要内容,如果未能解决你的问题,请参考以下文章
为啥发布运行的代码与在 Visual Studio 中运行不同
我的程序包含一个 DLL,但只能在我的计算机上运行。我的程序在另一台计算机上运行,但看不到硬件