【问题标题】:Graphics doesn't draw image in java图形不在java中绘制图像
【发布时间】:2016-08-10 22:41:36
【问题描述】:

我有这个应该绘制图像的类。

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,当我再次运行程序时,它没有绘制图像。然后我所做的任何事情都没有解决这个奇怪的错误。 有人有任何想法吗?我做错了什么?

【问题讨论】:

  • 1.为了尽快获得更好的帮助,请发布minimal reproducible exampleShort, Self Contained, Correct Example。 2. 例如,获取图像的一种方法是热链接到this Q&A 中看到的图像。
  • new JImage(imagePath, size, size); - 你只需创建一个新的类实例,对当前实例不做任何事情;调用 this(imagePath, size, size); 来调用另一个构造函数。这解决了我的问题。
  • public class JImage extends JPanel 从表面上看,JImage 类最好替换为JLabel。将图像设置为图标。

标签: java swing graphics


【解决方案1】:

图形在 java 中不绘制图像

您使用的是BoxLayoutBoxLayout 在进行布局时将使用面板的首选尺寸信息。您的首选尺寸是 (0, 0),因此无需绘制任何内容。

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

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2010-11-19
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多