图形不';在java中绘制图像

图形不';在java中绘制图像,java,swing,graphics,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 Buffered

我有一门课,应该画一个图像

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类中的Jpanel,当我再次运行该程序时,它没有绘制图像。我所做的一切都没有解决这个wierd bug。 有人有什么想法吗?我做错了什么

图形在java中不绘制图像

您使用的是
BoxLayout
。进行布局时,
BoxLayout
将使用面板的首选尺寸信息。您首选的大小是(0,0),因此没有任何可绘制的内容

在执行自定义绘制时,需要重写面板的
getPreferredSize()
方法,以返回组件的大小,这样布局管理器就可以完成其工作

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

图形在java中不绘制图像

您使用的是
BoxLayout
。进行布局时,
BoxLayout
将使用面板的首选尺寸信息。您首选的大小是(0,0),因此没有任何可绘制的内容

在执行自定义绘制时,需要重写面板的
getPreferredSize()
方法,以返回组件的大小,这样布局管理器就可以完成其工作


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

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

new JImage("../ico/appicon_200x200.png", 50)
应该变成这样:

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

应该是

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

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

new JImage("../ico/appicon_200x200.png", 50)
应该变成这样:

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

应该是

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

1.为了更快地获得更好的帮助,请发布一个or。2.例如,获取图像的一种方法是热链接到在。
new JImage(图像路径、大小、大小)中看到的图像-您只需创建该类的新实例,而不对当前实例执行任何操作;调用
this(图像路径、大小、大小)public类JImage扩展了JPanel
,从外观上看,
JImage
类最好用
JLabel
替换。将图像设置为图标。1。为了更快地获得更好的帮助,请发布一个or。2.例如,获取图像的一种方法是热链接到在。
new JImage(图像路径、大小、大小)中看到的图像-您只需创建该类的新实例,而不对当前实例执行任何操作;调用
this(图像路径、大小、大小)public类JImage扩展了JPanel
,从外观上看,
JImage
类最好用
JLabel
替换。将图像设置为图标。