Java 如何在JPanel上绘制PNG图像?
我试图通过重写Java 如何在JPanel上绘制PNG图像?,java,image,swing,drawing,jpanel,Java,Image,Swing,Drawing,Jpanel,我试图通过重写paintComponent方法在JPanel上绘制图像。然而,我一点运气都没有,我不知道为什么 以下是我目前掌握的代码: 绘图面板 public class DrawPanel extends JPanel{ private Image backgroundImg; public DrawPanel() { backgroundImg = Toolkit.getDefaultToolkit().createImage("C:\\User
paintComponent
方法在JPanel上绘制图像。然而,我一点运气都没有,我不知道为什么
以下是我目前掌握的代码:
绘图面板
public class DrawPanel extends JPanel{
private Image backgroundImg;
public DrawPanel()
{
backgroundImg = Toolkit.getDefaultToolkit().createImage("C:\\Users\\Administrator\\workspace\\Scrub\\src\\loginBackground.png");
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(backgroundImg, 0, 0, null);
}
}
登录Windows类
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class LoginWindow extends Window{
private DrawPanel panel;
public LoginWindow(int width, int height)
{
super("", width, height);
panel = new DrawPanel();
this.add(panel);
panel.setVisible(true);
}
}
Main
public class Main
{
public static void main(String[] args)
{
LoginWindow loginWindow = new LoginWindow(500, 300);
}
}
这可能不起作用的原因有很多
- 图像可能未加载。您应该改用
,因为如果出现问题,它将抛出ImageIO.read
IOException
- 布局管理器正在使用面板的首选大小(默认为0x0),使组件实际上不可见
- 您没有将窗口设置为可见
public class DrawPanel extends JPanel{
//...
public Dimension getPreferredSize() {
return backgroundImg == null ? new Dimesion(100, 100) : new Dimension(backgroundImg.getWidth(this), backgroundImg.gtHeight(this));
}
然后在你的视窗课上
public LoginWindow(int width, int height)
{
super("", width, height);
panel = new DrawPanel();
this.add(panel);
// Swing components are visible by default
//panel.setVisible(true);
// windows aren't
setVisible(true);
}
更简单的方法是使用JLabel
setLayout(new BorderLayout());
BufferedImage img = ImageIO.read(new File(...));
JLabel label = new JLabel(new ImageIcon(img));
add(label);
setVisible(true);
查看并了解更多详细信息您想要背景图像吗?那么也许这可以帮助你停止为JPanelSorry重新粉刷。关于你所说的窗户是可见的。LoginWindow扩展到我创建的另一个名为Window的类。在这个超类中,我有
setVisible(true)
,因此不需要再次调用它。事实上,窗口显示它只是没有绘制图像,仅此而已。好的,第一课,如果可以,请尽量避免使用已经存在的类名,或者尽早识别它们。其余的应该是有效的。。。