图形不能在java中绘制图像

时间:2016-08-10 14:07:04

标签: java swing graphics

我有这个类应该画一个图像。

package ro.adlabs.imnuriAZSMR.UIClases;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

import java.io.IOException;

public class JImage extends JPanel {
    private BufferedImage image;
    private int height;
    private int width;

    public JImage(String imagePath,int height,int width) {
        try {
            image = ImageIO.read(getClass().getResourceAsStream(imagePath));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        this.width = width;
        this.height = height;
    }
    public JImage(String imagePath,int size){
        new JImage(imagePath,size,size);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, width, height, this);
    }
}

此类显示关于对话框:

package ro.adlabs.imnuriAZSMR.UIClases;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class AboutDialog extends JDialog {
    public AboutDialog() {
        setTitle("About");
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        JLabel name = new JLabel("<html><div style='text-align: center;'>Aceasta aplicatie e dezvoltata sub Termenii si Conditiile ADLabs.</div></html>");
        JLabel copyright = new JLabel("© ADLabs - www.adlabs.ro");
        name.setAlignmentX(0.5f);
        copyright.setAlignmentX(0.5f);
        add(name);
        add(new JImage("../ico/appicon_200x200.png",50));
        add(copyright);
        JButton close = new JButton("Close");
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                dispose();
            }
        });
        close.setAlignmentX(0.5f);
        add(close);
        setModalityType(ModalityType.APPLICATION_MODAL);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setSize(300, 200);

    }
}

我在对话框中添加了应用徽标图片。我第一次创建它工作的JImage类时,它绘制了图片。然后我添加了方法:

setSize(width+20,height+20);

到JImage类中的Jpanel,当我再次运行程序时,它没有绘制图像。然后我做的任何事都没有解决这个奇怪的错误。 任何人有任何想法吗?我做错了什么?

2 个答案:

答案 0 :(得分:2)

  

图形不能在java中绘制图像

您正在使用BoxLayout。在进行布局时,BoxLayout将使用面板的首选大小信息。您的首选尺寸为(0,0),因此无需绘画。

当您进行自定义绘制时,您需要覆盖面板的getPreferredSize()方法以返回组件的大小,以便布局管理器可以完成它们的工作。

但是,正如已经提到的那样,不需要创建自定义类,因为您可以使用JLabel来显示图像。您进行自定义绘画的唯一时间是在绘制图像时需要以某种方式修改图像。

答案 1 :(得分:2)

您正在使用资源路径,而不是文件系统路径。这样的路径可能不包含..,并且相对于类的包目录或绝对。

new JImage("../ico/appicon_200x200.png", 50)

应该成为:

new JImage("/ro/adlabs/imnuriAZSMR/ico/appicon_200x200.png", 50)

此外:

public JImage(String imagePath, int size){
    new JImage(imagePath, size, size);
}

应该是

public JImage(String imagePath, int size){
    this(imagePath, size, size);
}