2017-05-22 4 views
0

ich die SceneBuilder bin mit einer Schnittstelle zu entwerfen und verwendet den Code here eine einfache FileChooser einzurichten zu öffnen und anzeigen Bilddateien.JavaFX Image (FXML) dosen't Show/ändern, um die Bilder

Der Code isoliert wurde getestet und Feinarbeiten, versuchte ich es in meine vorhandene Schnittstelle zu integrieren und Fehler hält gerade. Keine Fehlermeldung, nichts. Ich habe angefangen, println um die Befehle zu setzen und alles "funktioniert".

Hier ist meine GUI, das Design funktioniert bisher (Ich habe gerade angefangen ein VBox anstelle eines normalen Panel als alle meine Versuche mit war gescheitert)

<HBox prefHeight="790.0" prefWidth="927.0" style="-fx-background-color: green;"> 
     <children> 
      <VBox prefHeight="200.0" prefWidth="100.0"> 
       <children> 
        <ImageView fx:id="iv_main" fitHeight="473.0" fitWidth="462.0" pickOnBounds="true" preserveRatio="true" /> 
       </children> 
      </VBox> 
      <VBox prefHeight="790.0" prefWidth="236.0"> 
       <!-- And things inside --> 
      </VBox> 
     </children> 
     </HBox> 

Und der Code in der Steuerung - die initializer doesn‘ t irgendein Bild in dieser Version hier anzeigen. Doch wenn ich das gleiche in der Originaldatei nicht funktioniert es:

@FXML 
    private ImageView iv_main; 

    //I know this here looks nasty but I tried the path 1:1 in the 
    //isolated version (even a different project) - but works 100% 
    private String RESJPG = "/home/qohelet/NetBeansProjects/KV/src/main/resources/fxml/ahok.jpg"; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     /* 
     * In the original file here are two ObservableLists 
     * filled successfully. So I can assume the initialize-method works 
     */ 

     btn_openFolder.setOnAction(btnLoadEventListener);    
     try { 

     FileInputStream input = new FileInputStream(RESJPG); 
     Image image = new Image(input); 
      iv_main = new ImageView(image); 
     } catch (FileNotFoundException|NullPointerException | java.lang.IllegalArgumentException nupo) { 
      System.err.println(RESJPG + " not found"); 
     } 
    } 

Die Event-Handler arbeiten völlig in Ordnung an diesem Aktionsereignis - aber es tut nichts zur Image:

EventHandler<ActionEvent> btnLoadEventListener 
      = new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent t) { 
      System.out.println("Click"); 
      FileChooser fileChooser = new FileChooser(); 

      //Set extension filter 
      FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("Bilddateien", "*.JPG", "*.jpg", "*.jpeg", "*.JPEG", "*.PNG", "*.png"); 
      fileChooser.getExtensionFilters().addAll(extFilterJPG); 

      //Show open file dialog 
      File file = fileChooser.showOpenDialog(null); 
      System.out.println("File: " + file.getAbsolutePath()); 
      try { 
       BufferedImage bufferedImage = ImageIO.read(file); 
       Image image = SwingFXUtils.toFXImage(bufferedImage, null); 
       iv_main.setImage(image); 
       iv_main.setVisible(true); //In Swing you sometimes had to do that command - but here regardless if inserted or not, no changes 
      } catch (IOException ex) { 
       Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 
    }; 

Ich bin aus Ideen laufen jetzt ... die Datei korrekt in der Konsole angezeigt wird, halte ich sauber und den Bau des Projekts bewegt, um die Image um so gibt es keine Chance gibt, ist es nur mit einem anderen Objekt bedeckt, aber es gibt keine Änderungen im Ergebnis ...

ich versuche auch, diese beiden Möglichkeiten, um das Bild zu ändern (einmal am start, dann mit der FileChooser) - noch nichts.

Was mache ich falsch?

(auf die Version Verwandte (com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()) Ich verwende: 8.0.131-b11)

Antwort

2

Nie Felder initialisieren, die @FXML kommentierten werden. Sie verändern das Bild der ImageView Sie in der initialize() Methode erstellen, die statt der in der FXML Datei erstellt. Offensichtlich ist das eine in der FXML Datei erstellt ist derjenige, der tatsächlich in der Benutzeroberfläche angezeigt wird, und diejenige, die Sie in der initialize() Methode erstellen wird nie angezeigt (Sie nie steckte es in den Szenengraph überall); Sie ändern also das Bild einer Bildansicht, die nicht angezeigt wird.

ändern

iv_main = new ImageView(image); 

zu

iv_main.setImage(image); 
+0

das war es. Vielen Dank, Problem gelöst – Qohelet