无法在JPanel上设置JLabel的位置

时间:2012-02-22 12:28:15

标签: java swing jpanel jlabel

我为Jaabel设置了相对于JPanel的位置(0,0)。但它正在中心和顶部。我犯了什么错误?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*;
public class Main extends JFrame 
{ 
private JPanel panel;
private JLabel label1;
public Main() 
{ 
    panel = new JPanel(); 
    panel.setBackground(Color.YELLOW); 

    ImageIcon icon1 = new ImageIcon("3.png"); 
    label1 = new JLabel(icon1); 
    label1.setLocation(0,0); 
    panel.add(label1);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().add(panel); 
    this.setSize(500,500); 
    this.setVisible(true); 

} 

public static void main (String[] args) {
    new Main(); 
} 
} 

6 个答案:

答案 0 :(得分:8)

将布局管理器设置为null对我不起作用。试试这个:

// setLocation(0,0); //remove line.
panel.setLayout(new FlowLayout(FlowLayout.LEFT)); // change from 'centered'

瞧! :)我建议您调查新的RelativeLayout经理。

答案 1 :(得分:8)

使用布局!

Screenshot of left aligned image icon

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.URL;

public class Main extends JFrame
{
    private JPanel panel;
    private JLabel label1;

    public Main() throws Exception
    {
        // Do use layouts (with padding & borders where needed)!
        panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panel.setBackground(Color.YELLOW);

        URL url = new URL("http://pscode.org/media/starzoom-thumb.gif");
        ImageIcon icon1 = new ImageIcon(url);

        label1 = new JLabel(icon1);
        // Don't use null layouts, setLocation or setBounds!
        //label1.setLocation(0,0);
        panel.add(label1);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(panel);
        setSize(400,200);
        setLocationByPlatform(true);
        setVisible(true);
    }

    public static void main (String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Main();
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

更新

对这个帖子的回复似乎有很多混淆,所以澄清一件事:

  • 默认情况下,JPanel确实有FlowLayout
  • 它获得的FlowLayout来自'no args'构造函数,例如new FlowLayout() 1
  • FlowLayout的no-args构造函数生成..
      

    (1)..一个新的FlowLayout,具有居中对齐和默认的5个单位水平和垂直间隙。

答案 2 :(得分:3)

您不能这样做,因为默认布局管理器关心将元素渲染到面板中。

如果您真的想在位置上设置元素,请选择说panel = new JPanel(null);

但是等一下!你真的想这样做吗?我相信你没有。我们(java程序员)通常使用布局管理器提供的服务来在屏幕上呈现元素。你必须花一个小时来学习和理解这个概念,然后我向你保证你将使用这种技术而忘记在屏幕上手动渲染元素,这是一个非常糟糕的梦想。

答案 3 :(得分:2)

Component Container LayoutManager时,您无法设置setLayout(null)的绝对位置。您必须先致电JPanel {{1}},然后才能运作。

答案 4 :(得分:1)

写作

  

panel = new JPanel();

你强制面板使用FlowLayout,它内联添加元素。你可以使用

  

panel = new JPanel(null);

如果你想通过禁用FlowLayout管理器获得更多性能,但通过这样做你必须注意讨厌的东西,比如组件的位置,尺寸等等。我认为最好使用layout managers

答案 5 :(得分:1)

setLayout(null); //set your frame layout to null for abs. positioning
yourPanel = new JPanel(); // create your JPanel
yourPanel.setLayout(null); // set the layout null for this JPanel !

text1 = new JLabel("SB"); // create some stuff
text2 = new JLabel("BB");

yourPanel.add(text1); // add the stuff to the JPanel
yourPanel.add(text2);
yourPanel.getComponent(0).setBounds(0,0, 20, 20); // set your position of your elements inside your JPanel
yourPanel.setBorder(BorderFactory.createLineBorder(Color.black)); // set a testing border to help you position the elements better
yourPanel.setBounds(30, 200, 750, 220); // set the location of the JPanel

//给我回复