1

我正在尝试在 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();  
            }  
        });  
    }  
}  
4

3 回答 3

4

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

一种简单的解决方案是向标签添加一个 EmptyBorder,顶部/左侧插图为 100。然后,您可以将标签添加到 NORTH,而不是将标签添加到中心。代码将类似于:

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

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

于 2013-05-21T00:06:40.680 回答
3

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

你有很多选择...

  • 使用类似的东西JLayeredPane,默认情况下没有,但默认情况下,它有自己设置的布局管理器。有关更多详细信息,请参阅如何使用分层窗格
  • 创建一个能够在您想要的位置渲染图像的自定义组件。查看执行自定义绘画以获取更多详细信息
  • 创建您自己的布局管理器来执行您想要的操作...
于 2013-05-21T00:10:42.790 回答
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

于 2013-05-21T00:27:12.820 回答