0

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

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);
  }
}

现在我有以下问题:-

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

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

4

2 回答 2

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

  2. 您很可能应该避免调用setPreferredSize(),而是覆盖getPreferredSize(). 调用setPreferredSize()留给其他人修改该值的可能性。在这种情况下,这可能意味着首选大小不是组件的固有部分,因此您不需要调用setPreferredSize(). 虽然覆盖getPreferredSize()可以让您完全控制并导致首选大小成为组件的固有部分。

  3. 您还应该调用super.paintComponent(g);您的 CustomPanel。

  4. 在您的CustomLabel中,调用没有任何意义setLocation(父布局无论如何都会改变)

  5. 在您的CustomLabel中,这也没有任何意义:setSize(img.getIconWidth(),getHeight());因为父布局无论如何都会更改这些值(顺便说一句,getHeight()在这种情况下返回 0)

于 2013-01-02T13:58:34.117 回答
0

setLayout() 用于设置窗口的布局,对于布局,请单击此处 内容窗格默认使用 BorderLayout,通过将布局设置为 null 就没有布局,您看到的只是标题栏。

getPreferred() 用于获取您为组件提供的首选大小,而 set 用于设置首选大小:p

于 2013-01-02T13:35:42.000 回答