2016-03-25 2 views
0

Also, ich bin neu in JavaFX und als Teil eines Projekts versuche ich ImageView zu verwenden, um einige Bilder anzuzeigen. Bevor ich zu meinem eigentlichen Projekt hinzufüge, habe ich Folgendes eingerichtet, um sicher zu sein, dass ich die Verwendung von ImageViews verstanden habe.ImageView zeigt das Bild nicht an, wenn es vom Projektraum kommt

Mein Controller:

import javafx.fxml.FXML; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.stage.Stage; 

public class TestController { 


    @FXML 
    ImageView imageView; 

    Image image; 

    public void start(Stage stage){ 
     /* 
     * THIS WORKS! 
     * 
     * image = new Image("file:/C://Users//Owner//Pictures//MyProjectPhotos/picture.jpg"); 
     */ 

     //BUT THIS DOESN'T :(
     image = new Image("file:/JavaFXPractice/photos/picture.jpg"); 

     imageView.setImage(image); 

     imageView.setOnMouseClicked(me -> System.out.println("hello")); 
    } 

} 

Die fxml:

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

<?import javafx.scene.image.ImageView?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.VBox?> 

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" 
xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1"  
fx:controller="application.TestController"> 
    <children> 
     <VBox layoutX="156.0" layoutY="88.0" prefHeight="272.0" prefWidth="378.0"> 
     <children> 
      <ImageView fx:id="imageView" fitHeight="276.0" fitWidth="378.0" 
      pickOnBounds="true" preserveRatio="true" /> 
      </children> 
     </VBox> 
    </children> 
</AnchorPane> 

Und schließlich folgt aus:

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

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("/view/TestPage.fxml")); 
     AnchorPane root = (AnchorPane) loader.load(); 
     Scene scene = new Scene(root); 

     primaryStage.setScene(scene); 
     primaryStage.setResizable(false); 
     primaryStage.show(); 

     TestController control = loader.getController(); 
     control.start(primaryStage); 
    } 

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

Mein Problem ist in der Testcontroller-Klasse. Wie Sie in dem mehrzeiligen Kommentar sehen (und auch den Kommentar/die Zeile darunter), wird das Bild korrekt angezeigt, wenn ich es von meinem lokalen Computer bekomme, aber nicht, wenn ich es aus meinem Projektraum bekomme. Ich habe jetzt stundenlang versucht, das herauszufinden, aber jedes Mal, wenn ich versuche, ein Foto aus meinem Projektraum zu holen, erscheint nichts auf dem ImageView. Es ist nicht null (auch nicht das Bild), und es gibt keine gemeldeten Fehler. Ich habe auch versucht, nach einer Antwort zu suchen, aber bisher kein Glück.

image = new Image(getClass().getResource("/photos/picture.jpg").toExternalForm()); 

unter der Annahme, dass „Fotos“ einen Ordner an der Wurzel des Projekts ist:

+0

Ich bin nicht ganz sicher, was Sie mit "Projektraum" meinen, vielleicht meinen Sie [Klassenpfad] (http://stackoverflow.com/questions/2396493/what-is-a-classpath)? Wenn dies der Fall ist, lesen Sie vielleicht das [image javadoc] (https://docs.oracle.com/javase/image/Image.html), das verschiedene Möglichkeiten zum Abrufen eines Bildes erläutert . Im Grunde genommen möchten Sie wahrscheinlich das 'file:' Protokoll nicht verwenden, außer Sie möchten etwas außerhalb Ihres Klassenpfads erhalten. Wenn Sie weiterhin Probleme haben, stellen Sie möglicherweise eine Ausgabebaumstruktur Ihres Projekt-Zielverzeichnisses oder der 'jar -tvf'-Ausgabe für Ihr jar bereit. – jewelsea

Antwort

1

Sie können Ihre Bilder wie diese laden. Dieser Ordner muss sich im Klassenpfad befinden. Abhängig von Ihrer IDE kann dies auf verschiedene Arten erreicht werden. In Eclipse kann dies erreicht werden, indem dieser Ordner in einen "Quellordner" gestellt wird. Eine typische Struktur ist

project 
    src 
     ... 
    res 
     photos 
     picture.jpg 

wo beide „src“ und „res“ sind Quellordner.

Verwandte Themen