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