如何在JPanel上的某个点上定位?

时间:2013-11-25 19:06:33

标签: java swing jpanel layout-manager null-layout-manager

现在我有以下代码将JLabel添加到Panel的顶部中心,我认为这是默认的

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 ....所以你如何将某些东西定位到Panel中的某个点?

4 个答案:

答案 0 :(得分:2)

使用适当的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)

答案 1 :(得分:2)

由于storePanel无法正常工作,因此您的JPanel似乎是FlowLayout且默认setBounds(20, 20, 50, 50);经理。它将使用null布局(storePanel.setLayout(null);)。

但我建议您使用LayoutManager

答案 2 :(得分:1)

虽然不推荐,但如果将布局管理器设置为null,则可以进行绝对定位。

storePanel.setLayout(null);
// imageLabel initialization code
storePanel.add(imageLabel);
imageLabel.setBounds(20, 20, 50, 50);

Oracle Documentation


我的建议是使用Good IDE + UI Builder组合,例如:

Thease是WYSIWYG工具,可以使用灵活的布局管理器生成Swing代码,例如Group LayoutJGoodies Form Layout

如果要设计好的UI,布局管理器是必须的。它们不仅可以处理组件的大小和位置,还可以重新分配/重新定位/调整窗口大小等组件(这很难直接获得)。此外,那些UI设计师可以暗示您,以便您遵循指南和最佳实践,以设计高质量/跨平台的UI。

答案 3 :(得分:1)

如果您不介意一些手动工作,可以使用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);        
    }
}