web-dev-qa-db-fra.com

Comment afficher une image à l'aide du composant ImageView dans javafx et fxml?

Je suppose que c'est une chose très simple, mais que je ne peux tout simplement pas m'embrouiller ... Tout ce que je veux, c'est montrer une image sur un ImageView lié à fxml ... ". Voici mon code:

package application;

import Java.io.File;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;


public class Main extends Application
{
    @FXML
    private ImageView imageView;

    @Override
    public void start(Stage primaryStage) 
    {
        try 
        {
        AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
        Scene scene = new Scene(root,400,400);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setTitle("Hello World");

        File file = new File("src/Box13.jpg");
        Image image = new Image(file.toURI().toString());
        imageView = new ImageView(image);

        //root.getChildren().add(imageView);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

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

Et mon fichier fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import Java.lang.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="316.0" prefWidth="321.0" xmlns:fx="http://javafx.com/fxml/1"     xmlns="http://javafx.com/javafx/2.2" fx:controller="application.SampleController">
  <children>
    <ImageView fx:id="imageView" fitHeight="150.0" fitWidth="200.0" layoutX="61.0" layoutY="83.0" pickOnBounds="true" preserveRatio="true" >

    </ImageView>
  </children>
</AnchorPane>

Il ne devrait y avoir aucun problème avec la liaison de fichier car cela fonctionne très bien lorsque j'inclus la ligne supprimée. Ce serait comme cela que cela se faisait en Java uniquement, mais je veux utiliser fxml ici, car je l'utilise pour tous les autres composants, mais cela ne fonctionne tout simplement pas pour ImageView et je ne sais pas pourquoi. J'ai également essayé de créer une nouvelle classe de contrôleur et de lier l'ImageView à cet emplacement, mais cela ne fonctionne pas. Quelqu'un peut-il m'aider?

Merci

10
user3472050

Si vous souhaitez utiliser FXML, vous devez séparer le contrôleur (comme vous le faisiez avec SampleController). Ensuite, votre fx:controller dans votre FXML devrait indiquer cela.

Il vous manque probablement la méthode initialize dans votre contrôleur, qui fait partie de l'interface Initializable. Cette méthode est appelée après le chargement du fichier FXML. Je vous recommande donc de définir votre image à cet emplacement.

Votre classe SampleController doit ressembler à ceci:

public class SampleController implements Initializable {

    @FXML
    private ImageView imageView;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        File file = new File("src/Box13.jpg");
        Image image = new Image(file.toURI().toString());
        imageView.setImage(image);
    }
}

J'ai testé ici et ça marche.

14
Fernando Paz

Vous n'avez pas besoin d'un initialiseur, sauf si vous chargez dynamiquement une image différente à chaque fois. Je pense que faire autant que possible en fxml est plus organisé. Voici un fichier fxml qui fera ce dont vous avez besoin.

<?xml version="1.0" encoding="UTF-8"?>

<?import Java.lang.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>

<AnchorPane
    xmlns:fx="http://javafx.co/fxml/1"
    xmlns="http://javafx.com/javafx/2.2"
    fx:controller="application.SampleController"
    prefHeight="316.0"
    prefWidth="321.0"
    >
    <children>
        <ImageView
                fx:id="imageView"
                fitHeight="150.0"
                fitWidth="200.0"
                layoutX="61.0"
                layoutY="83.0"
                pickOnBounds="true"
                preserveRatio="true"
            >
            <image>
                <Image
                    url="src/Box13.jpg"
                    backgroundLoading="true"
                    />
            </image>
        </ImageView>
    </children>
</AnchorPane>

La spécification de la propriété backgroundLoading dans la balise Image est facultative. La valeur par défaut est False. Il est préférable de définir backgroundLoading sur true lorsque le chargement de l'image prend quelques instants. Ainsi, un espace réservé sera utilisé jusqu'au chargement de l'image et le programme ne se fige pas pendant le chargement.

12
Aaron Zimmerman

Image imProfile = new Image (getClass (). GetResourceAsStream ("/ img/profile128.png"));

ImageView profileImage = new ImageView (imProfile);

dans un javafx maven:

 enter image description here

1
Nelson Rodriguez
@FXML
ImageView image;

@Override
public void initialize(URL url, ResourceBundle rb) {
  image.setImage(new Image ("/about.jpg"));
}
1
sabracadabra

src/sample/images/shopp.png

**
    Parent root =new StackPane();
    ImageView ımageView=new ImageView(new Image(getClass().getResourceAsStream("images/shopp.png")));
    ((StackPane) root).getChildren().add(ımageView);

**
0
veysel sarı

Il est recommandé de mettre l'image dans les ressources, vous pouvez l'utiliser comme ceci:

imageView = new ImageView("/gui.img/img.jpg");
0
stuckhelper

Veuillez trouver ci-dessous un exemple de chargement d'image à l'aide de JavaFX.

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;

    public class LoadImage extends Application {

    public static void main(String[] args) {
    Application.launch(args);
    }
    @Override
    public void start(Stage primaryStage) {
    primaryStage.setTitle("Load Image");

    StackPane sp = new StackPane();
    Image img = new Image("javafx.jpg");
    ImageView imgView = new ImageView(img);
    sp.getChildren().add(imgView);

    //Adding HBox to the scene
    Scene scene = new Scene(sp);
    primaryStage.setScene(scene);
    primaryStage.show();
    }

  }

Créez un dossier source avec le nom Image dans votre projet et ajoutez votre image à ce dossier. Sinon, vous pouvez directement charger l'image à partir d'une URL externe, comme suit.

Image img = new Image (" http://mikecann.co.uk/wp-content/uploads/2009/12/javafx_logo_color_1.jpg ");

0
Ranjitsinh