如何在JFrame中设置图像的位置

时间:2013-05-21 00:04:29

标签: java swing jframe layout-manager

我正在尝试在JFrame中设置图像的位置。我认为 label.setLocation(100,100); 会将图像的位置设置为100,100(左上角),但无论我把它放在哪里都似乎没有做任何事情。我甚至尝试过panal.setLocation(100,100)。两者都什么都不做,我得到没有错误图像确实出现但是0,0。我做错了什么?这是我的代码:

import javax.swing.*;  

public class DisplayImage {  
    public DisplayImage() {  
        JFrame frame = new JFrame("Display Image");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

        JPanel panel = (JPanel)frame.getContentPane();  

        JLabel label = new JLabel();  
        label.setIcon(new ImageIcon("src/img/school.png"));
        label.setLocation(100, 100);
        panel.add(label);  

        frame.setLocationRelativeTo(null);  
        frame.pack();  
        frame.setVisible(true);  
    }  

    public static void main (String args[]) {  
        SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
                new DisplayImage();  
            }  
        });  
    }  
}  

3 个答案:

答案 0 :(得分:4)

默认情况下,JFrame使用BorderLayout。将标签添加到框架时,标签将添加到BorderLayout的CENTER中。布局管理器将覆盖该位置。

一个简单的解决方案是在标签中添加一个EmptyBorder,其中top / left insets为100.然后,不是将标签添加到中心,而是将标签添加到NORTH。代码类似于:

label.setBorder( new EmptyBorder(...) );
panel.add(label, BorderLayout.SOUTH);

作为一般规则,您不应该尝试指定组件的确切位置。让布局管理人员完成他们的工作。

答案 1 :(得分:3)

默认情况下,JFrame使用BorderLayout作为布局管理器。这将覆盖您提供给setLocation方法的任何设置。

你有很多选择......

  • 使用像JLayeredPane这样的东西,但默认情况下,默认情况下,它具有自己设置的布局管理器。有关详细信息,请参阅How to use layered panes
  • 创建一个能够在您想要的位置重新渲染图像的自定义组件。查看Performing Custom Painting了解更多详情
  • 创建自己的布局管理器,执行您想要的操作......

答案 2 :(得分:0)

这对我有用:

import java.awt.Dimension;
import javax.swing.*;  

public class DisplayImage {  
    public DisplayImage() {  
        JFrame frame = new JFrame("Display Image");  
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

        JPanel panel = (JPanel)frame.getContentPane();  
        panel.setLayout(null);

        JLabel label = new JLabel();  
        label.setIcon(new ImageIcon("rails.png"));
        panel.add(label);
        Dimension size = label.getPreferredSize();
        label.setBounds(100, 100, size.width, size.height);

        frame.setSize(300, 200);
        frame.setVisible(true);  
    }  

    public static void main (String args[]) {  
        SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
                new DisplayImage();  
            }  
        });  
    }  
}  

但你应该读到这个:

http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html