2

I am fairly new to programming and have recently encountered a problem that I have not found a solution for online. I have created an ImageView in FXML and gave it an FXid of "gif1". I am using code from this stackoverflow post but I tried modifying it so that it would fit my needs. I put the entirety of the code in a separate java file that I called "Gif.java". Typically, "Gif.java" uses an hbox and other non applicable methods to set the ImageView. I removed those because I will be using an existing FXML document so there is no need to create a new one. In my code, I call on "Gif.java" and expect a returned ImageView. However, when I set my ImageView (gif1) to the returned ImageView, it doesn't update on the screen.

Here is the link to the gif post: How I can stop an animated GIF in JavaFX?

Here is my code that I use to update gif1:

@FXML
    private void setUp(){
        Gif newGif = new Gif("rightrock.gif");  // Creates object newGif and passes through path to gif
        gif1 = newGif.returnImage2();  // Sets gif1 to returned ImageView
    }

Here is the return code in Gif.java:

public class Gif{
    private Animation ani;
    private ImageView test;
    public Gif(String image) {
        // TODO: provide gif file, ie exchange banana.gif with your file
        ani = new AnimatedGif(getClass().getResource(image).toExternalForm(), 1000);
    ani.setCycleCount(1);
    ani.play();

    Button btPause = new Button( "Pause");
    btPause.setOnAction( e -> ani.pause());

    Button btResume = new Button( "Resume");
    btResume.setOnAction( e -> ani.play());
}

public void returnImage(ImageView x){
    test = x;  // Sets ImageView test to parameter x
}

public ImageView returnImage2() {
    return test;  // Return instance field test
}

public static void main(String[] args) {
    launch(args);
}

public class AnimatedGif extends Animation {

    public AnimatedGif( String filename, double durationMs) {

        GifDecoder d = new GifDecoder();
        d.read( filename);

        Image[] sequence = new Image[ d.getFrameCount()];
        for( int i=0; i < d.getFrameCount(); i++) {

            WritableImage wimg = null;
            BufferedImage bimg = d.getFrame(i);
            sequence[i] = SwingFXUtils.toFXImage( bimg, wimg);

        }

        super.init( sequence, durationMs);
    }

}

public class Animation extends Transition {

    private ImageView imageView;
    private int count;

    private int lastIndex;

    private Image[] sequence;

    private Animation() {
    }

    public Animation( Image[] sequence, double durationMs) {
        init( sequence, durationMs);
    }

    private void init( Image[] sequence, double durationMs) {
        this.imageView = new ImageView(sequence[0]);
        this.sequence = sequence;
        this.count = sequence.length;

        setCycleCount(1);
        setCycleDuration(Duration.millis(durationMs));
        setInterpolator(Interpolator.LINEAR);

    }

    protected void interpolate(double k) {

        final int index = Math.min((int) Math.floor(k * count), count - 1);
        if (index != lastIndex) {
            imageView.setImage(sequence[index]);
            lastIndex = index;
        }

    }

    public ImageView getView() {
        returnImage(imageView);  // This runs returnImage with the ImageView that I want to set
        return imageView;
    }

}

Any help would be greatly appreciated!

Community
  • 1
  • 1
Yousef Ahmed
  • 33
  • 1
  • 4

0 Answers0