繁体   English   中英

如何让 Swing 显示/重绘自定义组件?

[英]how to get swing to display/repaint a custom component?

所以我有一个我正在开发的小“游戏”,其中一部分图标按行显示(每个图标都是一个 jpanel)。 我添加的这些 Icon 组件在隔离时可以完美显示,但是当我将它们添加到它们的每一行时,它们似乎根本没有显示。 我是秋千的新手,所以我想知道是不是因为图像比它们放入的行小一点?

这是独立运行良好的图标的代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

import java.nio.file.Path;

public class fermiPicoNanoImage extends JPanel {
    private BufferedImage image = null;
    private int[] imageDims = new int[] { 83, 47};

    //for testing
    public String currentImage;

    public fermiPicoNanoImage() throws IOException {

    }

    public void set(String whichImage) throws IOException, IllegalArgumentException  {

        whichImage = whichImage.toLowerCase();

        try {

            if(  whichImage == "fermi"  || whichImage == "f"  ) {
                Path filePath = Paths.get("src\\resources\\icon-fermi.png").toAbsolutePath();
                image = ImageIO.read(  new File(  filePath.toString()  )  );
                currentImage = "fermi";
            }
            else if(  whichImage == "nano"  || whichImage == "n"  ){
                Path filePath = Paths.get("src\\resources\\icon-nano.png").toAbsolutePath();
                image = ImageIO.read(  new File(  filePath.toString()  )  );
                currentImage = "nano";
            } 
            else if(  whichImage == "pico"  || whichImage == "p"  ) {
                Path filePath = Paths.get("src\\resources\\icon-pico.png").toAbsolutePath();
                image = ImageIO.read(  new File(  filePath.toString()  )  );
                currentImage = "pico";
            }else {
                throw new IllegalArgumentException();
            }



        }catch(Exception err) {
            System.err.println( err.getMessage() );
            err.printStackTrace();
        }


        this.repaint();

    }


    public void unset(){
        image = null;
        currentImage = null;
        this.repaint();
    }



    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

       if(image != null) {
            g.drawImage(image, 0, 0, null);
       }else if(image == null) {
           g.drawImage(image, 0, 0, Color.WHITE, null);
       }


    }

    public static void main(String[] args) throws IOException{
        fermiPicoNanoImage fnpImage = new fermiPicoNanoImage();

        JFrame frame = new JFrame();
        frame.add(fnpImage);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setVisible(true);


       fnpImage.set("pico");


    }




}

应放置自定义组件的行

呈现一切的 JFrame 就在这里。 正如其他 Stack 帖子中所建议的那样,我在将框架设置为可见之前添加了组件。 我不确定是渲染的问题还是 with 的问题。

现在我找不到让主类为你们工作的简单方法,因为使用了本地图像,所以我只将整个 eclipse 项目放入谷歌驱动器文件夹中供你们所有人使用。

https://drive.google.com/drive/folders/12n-Ze2jivwVJ1XxgQILN5zKNRfZNJ6Z5?usp=sharing

关于让组件渲染所需的任何建议都会有很大帮助。 谢谢!

关于我需要什么来渲染组件的任何建议都会有很大帮助

您是否通过在 if 条件中添加 System.out.println(...) 语句来验证您的代码是否正在执行?

一个可能的问题如下:

else if(  whichImage == "pico"  || whichImage == "p"  ) {

不要使用“==”进行字符串比较。

“==”检查对象是否是同一个实例,而不是对象的值是否相同。

而是使用equals(…)方法:

else if(  "pico".equals(whichImage) || "p".equals(whichImage)  ) {

比较顺序已更改,因此即使“whichImage”变量为空,它仍然可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM