Java 需要帮助清除我的swing应用程序中的某些疑问吗

Java 需要帮助清除我的swing应用程序中的某些疑问吗,java,swing,graphics,graphics2d,Java,Swing,Graphics,Graphics2d,下面是一个简单的swing应用程序,我在其中试验了某些自定义技术。代码如下:- import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax

下面是一个简单的swing应用程序,我在其中试验了某些自定义技术。代码如下:-

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class ThemeComponents extends JFrame{
  public static void main(String args[])
  {
    SwingUtilities.invokeLater(new Runnable(){public void run(){new    ThemeComponents();}});
  }

  public ThemeComponents()
  {
    super("HACK 1:Creating Image Themed Components ");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout());
    CustomPanel p1=new CustomPanel();
    p1.add(new CustomLabel());
    add(p1);
    pack();
    setVisible(true);
  }
}

class CustomPanel extends JPanel
{
  BufferedImage img;
  CustomPanel()
  {
    try
    {
      img=ImageIO.read(new File("src/background.jpg"));
    } catch(IOException e){
      System.out.println("Error in loading background image "+e);
    }
  }
  public void paintComponent(Graphics g)
  {
    g.drawImage(img,0,0,getWidth(),getHeight(),null);
  }
  public Dimension getPreferredSize()
  {
    return new Dimension(img.getWidth(),img.getHeight());
  }
}

class CustomLabel extends JLabel
{
  ImageIcon img;
  CustomLabel ()
  {
    img=new ImageIcon("src/tornado.gif");


    setSize(img.getIconWidth(),getHeight());
    setIcon((Icon) img);
    //setOpaque(false);
    //setIconTextGap(0);
    setLocation(10,10);
  }
}
现在我有以下问题:-

1) 当我在我的主类
ThemeComponents
中将布局设置为null
setLayout(null)
时,为什么只有标题栏时框架大小缩小为null?我希望它采用
CustomPanel
的大小,就像我对框架使用的
pack()
一样。(但使用flowlayout、borderlayout等布局会生成正确的输出)

2) 使用
getPreferredSize()
设置组件的大小比使用
setPreferredSize()
更好。实际上,我没有发现它们之间有任何区别。

setLayout()用于设置窗口的布局,用于布局 默认情况下,内容窗格使用BorderLayout,只需将布局设置为null即可 没有布局,您只看到标题栏

getPreferred()用于获取给定给组件的首选大小,而 用于设置首选大小:p

  • 如果使用
    null
    -layout,首选大小将返回(0,0),因此只能看到标题栏
    pack()
    验证您的
    JFrame
    ,然后将
    JFrame
    的大小设置为内容窗格的首选大小(即0,0),并为标题栏、菜单等添加所需的空间

  • 很可能您应该避免调用
    setPreferredSize()
    ,而应该重写
    getPreferredSize()
    。调用
    setPreferredSize()
    可以让其他人修改该值。在这种情况下,可能意味着首选大小不是组件的固有部分,因此不需要调用
    setPreferredSize()
    。重写
    getPreferredSize()
    时,您可以完全控制并使首选大小成为组件的固有部分

  • 您还应该调用
    super.paintComponent(g)在您的CustomPanel中

  • 在您的
    CustomLabel
    中,调用
    setLocation
    没有任何意义(父布局仍将更改此设置)

  • CustomLabel
    中,这也没有任何意义:
    setSize(img.getIconWidth(),getHeight())getHeight()
    在这种情况下返回0)


  • :是的!!但是,即使没有布局,面板也应该在那里,并且它必须给出框架的大小