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

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()

我正在尝试设置JFrame中图像的位置。我想label.setLocation(100100)会将图像的位置设置为100100(左上角),但无论我放在哪里,它似乎都没有任何作用。我甚至尝试了panal.setLocation(100100)。两者都不做任何操作,我得到没有错误,并且图像确实出现,但在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();  
            }  
        });  
    }  
}  

默认情况下,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时避免…IMHO
          null
          layout从来都不是一个合适的建议。问题是在更新容器的过程中有很多管理代码,包括
          preferred/minimum/maximum/Size
          之类的东西,这些代码允许其他布局管理员决定如何最好地响应环境中的更改。您还可能会发现,不同的平台具有不同的DPI和字体度量,这将影响这些组件的布局方式-IMHO“这对我有用:”
          setLa