现在我有以下代码,它将JLabel添加到面板的顶部中心,我认为它是默认的
imageLabel = new JLabel();
ImageIcon customer1 = new ImageIcon("src/view/images/crab.png");
imageLabel.setIcon(customer1);
storePanel.add(imageLabel);
imageLabel.setBounds(20, 20, 50, 50);
setBounds显然没有把它放在20,20……那么你如何在面板中定位某个点呢?
使用适当的LayoutManager在面板中放置组件。
http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
在您的情况下,您应该能够使用FlowLayout
,并在创建时设置水平和垂直间隙。
http://docs.oracle.com/javase/7/docs/api/java/awt/FlowLayout.html#FlowLayout(int,%20int,%20int)
似乎您的storePanel
是JPanel
,并且有默认的FlowLayout
管理器,因为您的setBounds(20, 20, 50, 50);
不起作用。它将使用空布局(storePanel.setLayout(null);
)。
但我建议您使用LayoutManager
。
如果您不介意一些手工工作,您可以使用SpringLayout向标签添加约束。这允许您将边缘定位为与其他边缘相距精确距离,默认情况下,这也会对组件大小进行排序(通过在布局时基本上将边缘设置为一定距离)。我在下面用textArea演示了这一点,但它也可以很容易地应用于您的标签。
public class SO {
public static void main(String[] args) {
//Components
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setSize(frame.getSize());
JTextArea text = new JTextArea();
//Add components
panel.add(text);
frame.add(panel);
//Layout add & setup
SpringLayout layout = new SpringLayout();
panel.setLayout(layout);
layout.putConstraint(SpringLayout.WEST, text, 10, SpringLayout.WEST, panel);
layout.putConstraint(SpringLayout.NORTH, text, 10, SpringLayout.NORTH, panel);
layout.putConstraint(SpringLayout.EAST, text, -10, SpringLayout.EAST, panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
}
尽管不推荐,但如果将布局管理器设置为null
,则可以进行绝对定位。
storePanel.setLayout(null);
// imageLabel initialization code
storePanel.add(imageLabel);
imageLabel.setBounds(20, 20, 50, 50);
Oracle文档
我的建议是使用好的IDE+UI生成器组合,例如:
- Netbeans GUI生成器
- Eclipse WindowBuilder
- IntelliJ GUI设计器
Thease是所见即所得的工具,可以使用灵活的布局管理器(如Group Layout或JGoodies Form Layout)生成Swing代码。
如果你想设计好的UI,布局管理器是必须的。它们不仅处理组件的大小和定位,还处理诸如在窗口调整大小时重新分配/重新定位/调整组件大小之类的事情(这真的很难用手)。此外,这些UI设计师可以提示您,以便您遵守指导方针和最佳实践,以便设计高质量/跨平台的UI。