【问题标题】:How to draw PNG Image onto JPanel?如何将PNG图像绘制到JPanel上?
【发布时间】:2014-03-06 04:48:00
【问题描述】:

我试图通过覆盖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);
    }
}

登录窗口类

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

主要

public class Main
{
    public static void main(String[] args)
    {
        LoginWindow loginWindow = new LoginWindow(500, 300);


    }
}

【问题讨论】:

标签: java image swing drawing jpanel


【解决方案1】:

这可能不起作用的原因有很多

  • 图像可能未加载。您应该改用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));
    }

然后在你的 Window 类中...

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

查看How to use LabelsReading/Loading an Image 了解更多详情

【讨论】:

  • 很抱歉给您带来了困惑。关于你所说的 Window 的可见性。 LoginWindow 扩展到我创建的另一个名为 Window 的类。在这个超类中,我有setVisible(true),所以不需要再次调用它。事实上,窗口显示它只是没有绘制图像,仅此而已。
  • 好的,教训,尽量避免使用已经存在的类名,如果你能或尽早识别它们。其余的应该是有效的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多