Java 如何设置图像在JFrame中的位置
我正在尝试设置JFrame中图像的位置。我想label.setLocation(100100)会将图像的位置设置为100100(左上角),但无论我放在哪里,它似乎都没有任何作用。我甚至尝试了panal.setLocation(100100)。两者都不做任何操作,我得到没有错误,并且图像确实出现,但在0,0处。我做错了什么?这是我的密码:Java 如何设置图像在JFrame中的位置,java,swing,jframe,layout-manager,Java,Swing,Jframe,Layout Manager,我正在尝试设置JFrame中图像的位置。我想label.setLocation(100100)会将图像的位置设置为100100(左上角),但无论我放在哪里,它似乎都没有任何作用。我甚至尝试了panal.setLocation(100100)。两者都不做任何操作,我得到没有错误,并且图像确实出现,但在0,0处。我做错了什么?这是我的密码: import javax.swing.*; public class DisplayImage { public DisplayImage()
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();
}
});
}
}
默认情况下,JFrame使用BorderLayout。将标签添加到框架时,标签将添加到BorderLayout的中心。布局管理器将覆盖该位置 一个简单的解决方案是在标签上添加一个EmptyBorder,顶部/左侧的insets为100。然后将标签添加到北方,而不是将标签添加到中心。代码类似于:
label.setBorder( new EmptyBorder(...) );
panel.add(label, BorderLayout.SOUTH);
一般来说,您不应该试图指定组件的确切位置。让布局管理器执行其作业。默认情况下,JFrame使用BorderLayout。将标签添加到框架时,标签将添加到BorderLayout的中心。布局管理器将覆盖该位置 一个简单的解决方案是在标签上添加一个EmptyBorder,顶部/左侧的insets为100。然后将标签添加到北方,而不是将标签添加到中心。代码类似于:
label.setBorder( new EmptyBorder(...) );
panel.add(label, BorderLayout.SOUTH);
一般来说,您不应该试图指定组件的确切位置。让布局管理器开始工作。默认情况下,
JFrame
使用边框布局作为布局管理器。这将覆盖您提供给setLocation
方法的任何设置
你有很多选择
- 使用类似于
JLayeredPane
的工具,默认情况下,它没有自己设置的布局管理器。有关更多详细信息,请参阅
- 创建一个自定义组件,该组件能够在需要的位置渲染图像。查看更多详细信息
- 创建自己的布局管理器,以执行所需的操作
默认情况下,
JFrame
使用边框布局作为布局管理器。这将覆盖您提供给setLocation
方法的任何设置
你有很多选择
- 使用类似于
JLayeredPane
的工具,默认情况下,它没有自己设置的布局管理器。有关更多详细信息,请参阅
- 创建一个自定义组件,该组件能够在需要的位置渲染图像。查看更多详细信息
- 创建自己的布局管理器,以执行所需的操作
这对我来说很有用:
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();
}
});
}
}
但你应该读到:
这对我来说很有用:
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();
}
});
}
}
但你应该读到:
Java GUI可能必须在多种平台上工作,使用不同的屏幕分辨率和不同的PLAF。因此,它们不利于部件的精确放置。对于健壮的GUI,可以使用布局管理器或它们的组合,以及布局填充和空白边框来组织组件…请参阅演示。Java GUI可能需要在多种平台、不同的屏幕分辨率和使用不同的PLAF上工作。因此,它们不利于部件的精确放置。对于一个健壮的GUI,可以使用布局管理器,或者它们的组合,以及空白区域的布局填充和边框来组织组件…请参阅演示。我真的想要一个背景图像,然后将其他图像分层到background@Java作为问题的一部分,这些信息本来是有用的。尝试查看或创建一个自定义窗格/布局管理器…@MadProgrammer我想我找到了一个不太复杂的解决方案。我真的想要一个背景图像,然后将其他图像分层到background@Java作为问题的一部分,这些信息本来是有用的。尝试查看或创建一个自定义窗格/布局管理器…@MadProgrammer我想我找到了一个不太复杂的解决方案来解决我的问题null
layout从来都不是一个合适的建议。问题是在更新容器的过程中有很多管理代码,包括preferred/minimum/maximum/Size
之类的东西,这些代码允许其他布局管理员决定如何最好地响应环境中的更改。您还可能会发现,不同的平台具有不同的DPI和字体度量,这将影响这些组件的布局方式-IMHO“这对我有效:”setLayout(null)代码>为什么只为您开发?这可能会在下一台机器上坏掉,PLAF-1我从不主张这样做,我建议不要这样做的链接指向了错误的页面。Bu Sun说:“创建一个没有布局管理器的容器需要以下步骤。通过调用setLayout(null)将容器的布局管理器设置为null。”“我从来没有提倡过这样做。”这句话对我来说很有用:“像你提倡的那样读给我听。”。也许只是我。提示:添加@MadProgrammer(或者任何人,@
很重要)来通知他们一条新评论。我们在null
布局上“跳转”的原因是OP会问的下一个问题是“为什么容器不显示”,答案是,null
layout…这是一个恶性循环,最好在人们学习Swing时避免…IMHOnull
layout从来都不是一个合适的建议。问题是在更新容器的过程中有很多管理代码,包括preferred/minimum/maximum/Size
之类的东西,这些代码允许其他布局管理员决定如何最好地响应环境中的更改。您还可能会发现,不同的平台具有不同的DPI和字体度量,这将影响这些组件的布局方式-IMHO“这对我有用:”setLa