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
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.
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.
@FXML
ImageView image;
@Override
public void initialize(URL url, ResourceBundle rb) {
image.setImage(new Image ("/about.jpg"));
}
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);
**
Il est recommandé de mettre l'image dans les ressources, vous pouvez l'utiliser comme ceci:
imageView = new ImageView("/gui.img/img.jpg");
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 ");