Java 需要帮助清除我的swing应用程序中的某些疑问吗
下面是一个简单的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
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
中将布局设置为nullsetLayout(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)
:是的!!但是,即使没有布局,面板也应该在那里,并且它必须给出框架的大小