Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPanel上绘制PNG图像?_Java_Image_Swing_Drawing_Jpanel - Fatal编程技术网

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)
,因此不需要再次调用它。事实上,窗口显示它只是没有绘制图像,仅此而已。好的,第一课,如果可以,请尽量避免使用已经存在的类名,或者尽早识别它们。其余的应该是有效的。。。