Настройте непрозрачность изображения в JavaFX - PullRequest
1 голос
/ 22 марта 2019
import javafx.application.Application;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.FadeTransition;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ImageChoose extends Application{   

ImageView myImageView;

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

@Override
public void start(Stage primaryStage){

  final double MIN = 0.0, MAX = 1.0, INITIAL = .50;
  final double MAJOR_TICK_UNIT = .1;
  final int MINOR_TICK_COUNT = 1;
  final double SLIDER_WIDTH = 300.0;

  Button button = new Button("Search for Image");
  Slider slider = new Slider(MIN, MAX, INITIAL);
  slider.setMajorTickUnit(MAJOR_TICK_UNIT);
  slider.setMinorTickCount(MINOR_TICK_COUNT);
  slider.setShowTickMarks(true);
  slider.setShowTickLabels(true);
  slider.setSnapToTicks(true);
  slider.setPrefWidth(SLIDER_WIDTH);

  button.setOnAction(e ->
  {
    FileChooser fileChooser = new FileChooser();

    FileChooser.ExtensionFilter extFilterJPG = 
        new FileChooser.ExtensionFilter("JPG files (*.JPG)", "*.JPG");
    FileChooser.ExtensionFilter extFilterjpg = 
        new FileChooser.ExtensionFilter("jpg files (*.jpg)", "*.jpg");
    FileChooser.ExtensionFilter extFilterPNG = 
        new FileChooser.ExtensionFilter("PNG files (*.PNG)", "*.PNG");
    FileChooser.ExtensionFilter extFilterpng = 
        new FileChooser.ExtensionFilter("png files (*.png)", "*.png");
    fileChooser.getExtensionFilters()
        .addAll(extFilterJPG, extFilterjpg, extFilterPNG, extFilterpng);

    File file = fileChooser.showOpenDialog(null);


       try {BufferedImage bufferedImage = ImageIO.read(file);
            Image image = SwingFXUtils.toFXImage(bufferedImage, null);
            myImageView.setImage(image);
       } 
       catch (IOException ex) {

        Logger.getLogger(ImageChoose.class.getName()).log(Level.SEVERE, null, ex);
        }
    });

    FadeTransition ft = new FadeTransition(Duration.millis(1000),myImageView);


    slider.valueProperty().addListener((observable, oldvalue, newvalue) ->{
           ft.setFromValue(oldvalue.doubleValue());
           ft.setToValue(newvalue.doubleValue());
           ft.play();
    });

    myImageView = new ImageView();  
    myImageView.setFitWidth(500);
    myImageView.setPreserveRatio(true);

    VBox vBox = new VBox(10);
    vBox.getChildren().addAll(button, slider, myImageView);
    vBox.setAlignment(Pos.TOP_CENTER);
    Scene scene = new Scene(vBox, 800, 800);

    primaryStage.setTitle("Opacity Adjuster");
    primaryStage.setScene(scene);
    primaryStage.show();

    }

Цель этого состоит в том, чтобы иметь возможность выбрать файл изображения и настроить его непрозрачность с помощью ползунка.

Я пытаюсь настроить непрозрачность изображения после выбора файла с непрозрачностьюползунок, но ползунок непрозрачности не регулирует непрозрачность файла изображения, который я выбрал после перемещения ползунка вокруг.Может кто-нибудь сказать мне, что я здесь делаю не так?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Один из способов исправить это в соответствии с предложением @ vs97.Но основная причина вашего перехода не работает, потому что вы передаете null imageView, а затем создаете экземпляр ImageView.Сначала создайте экземпляр imageView, а затем передайте его переходу.Также я бы предпочел использовать playFromStart (), а не play () для плавного эффекта.

        myImageView = new ImageView();
        myImageView.setFitWidth(500);
        myImageView.setPreserveRatio(true);

        // Create the transition after instantiating myImageView.
        FadeTransition ft = new FadeTransition(Duration.millis(1000), myImageView);
        slider.valueProperty().addListener((observable, oldvalue, newvalue) -> {
            ft.setFromValue(oldvalue.doubleValue());
            ft.setToValue(newvalue.doubleValue());
            ft.playFromStart();
        });
1 голос
/ 22 марта 2019

Вы забыли установить узел , к которому должен применяться переход:

    slider.valueProperty().addListener((observable, oldvalue, newvalue) -> {
        ft.setFromValue(oldvalue.doubleValue());
        ft.setToValue(newvalue.doubleValue());
        ft.setNode(myImageView); //---> add this
        ft.play();
    });

Таким образом, вы в основном говорите, что когда вы меняете ползунок, вы хотите записать старое значение, получить новое значение и затем применить переход к вашему изображению (ImageView, строго говоря, так как ранее в вашем коде вы установили узел к myImageView.setImage(image);).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...