Как получить качели для отображения / перекрасить пользовательский компонент? - PullRequest
0 голосов
/ 25 марта 2020

Итак, у меня есть небольшая «игра», над которой я работаю, и у части ее есть значки, отображаемые в строках (каждая из которых 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");


    }




}

the rows the custom components should be placed in

JFrame, который отображает все, здесь. И, как предлагалось в других статьях стека, я добавил компоненты до того, как для фрейма было установлено значение visible Я не уверен, если это проблема с рендерингом или с.

Теперь я не мог найти простой способ заставить основной класс работать на вас, ребята, из-за использования локальных изображений, поэтому я положил весь проект eclipse в папку на диске Google для вас. ,

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

Любые предложения о том, что мне нужно, чтобы получить компонент для рендеринга, очень помогли бы. спасибо!

1 Ответ

2 голосов
/ 25 марта 2020

Любые предложения о том, что мне нужно, чтобы получить компонент для рендеринга, очень помогли бы

Вы проверили, выполняется ли ваш код, добавив операторы System.out.println (…) в ваших условиях if?

Одной из возможных проблем является следующее:

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

Не используйте "==" для сравнения строк.

"==" проверяет, являются ли объекты одним и тем же экземпляром, а не совпадает ли значение Object.

Вместо этого используйте метод equals(…):

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

Порядок сравнения изменяется таким образом, что все равно будет работать, даже если переменная whichImage равна нулю.

...