JavaFX ImageView不在BorderLayout中显示图像

问题描述:

我有一个包含视图的BorderLayout。在左侧和右侧有两个ImageViews。我通过另一个线程通过ObejctProperty设置图像。 TypedImage只是javaFXs Image的容器。JavaFX ImageView不在BorderLayout中显示图像

@Override 
public void changed(ObservableValue<? extends TypedImage> observable, 
     TypedImage oldValue, 
     TypedImage newValue) { 
    switch (newValue.getTyp()) { 
    case TYPE1: 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       imageView1.setImage(newValue.getImage()); 
      } 
     }); 
    case TYPE2: 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       imageView2.setImage(newValue.getImage()); 
      } 
     }); 
     break; 
    default: 
     break; 
    } 
} 

由于监听器正在监听两个ObjectProperties,所以改变的方法通常会调用两次。当第一次调用方法时,匹配的ImageView(取决于类型)将被更新并显示UI中的图像。当方法从第二个属性第二次调用时,对于第二个ImageView。从这一点只是最后更新的ImageView在用户界面中显示图像,第一个更新的ImageView是不可见或空的..任何人都可以帮助我理解和解决这个问题吗?

Java的Implementaion

public class MainApp extends Application { 
    private ObjectProperty<TypedImage> image1 = new SimpleObjectProperty<TypedImage>(); 
    private ObjectProperty<TypedImage> image2 = new SimpleObjectProperty<TypedImage>(); 

    public vois start(){ 
    [..] 
    image1.addListener(mainView.getController()); 
    image2.addListener(mainView.getController()); 
    { 
     Image1Drawer drawer = new Image1Drawer(); 
     drawer.setParent(this); 
     Thread t = new Thread(drawer); 
     t.start(); 
    } 
    { 
     Image2Drawer drawer = new Image2Drawer(); 
     drawer.setParent(this); 
     Thread t = new Thread(drawer); 
     t.start(); 
    } 
    [..] 
    } 

    public void notifyDrawerFinish(AbstractDrawer source, TypedImage img){ 
    if(source instanceof Image1Drawer){ image1.setValue(img); } 
    if(source instanceof Image2Drawer){ image2.setValue(img); } 
    } 
} 

/** 
    * extended by Image1Drawer and Image2Drawer, run-methode draws stuff on image 
    */ 
public abstract class AbstractDrawer implements Runable { 
    private MainApp parent; 
    private void fireFinish(TypedImage img){ 
    mainApp.notifyDrawerFinish(this,img); 
    } 
    public void setParent(MainApp parent){ 
    this.parent = parent; 
    } 
} 

public class MianViewController implements Initializable, ChangeListener { 
    @FXML 
    private ImageView imageView1; 
    @FXML 
    private ImageView imageView2; 

    [..] 
    public void changed(ObservableValue<? extends TypedImage> observable, 
     TypedImage oldValue, 
     TypedImage newValue) { 
    /* see above */ 
    } 
    [..] 
} 

FXML

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

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

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" 
    minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" 
    prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.nemo.view.MainViewController">> 
    <left> 
     <ImageView fx:id="imageView1" fitHeight="600.0" fitWidth="50.0" 
      pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER" /> 
    </left> 
    <right> 
     <ImageView fx:id="imageView2" fitHeight="600.0" fitWidth="50.0" 
      pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER" /> 
    </right> 
</BorderPane> 
+0

你可以发布[MCVE](http://stackoverflow.com/help/mcve),以便我可以更好地理解你的问题吗? – ItachiUchiha 2014-12-01 18:07:31

尝试将控制器的路径在FXML文件。我想你错过了:

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" 
minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" 
prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="YOUR_PACKAGE_NAME.MianViewController"> 
+0

Soory我忘了复制这个..它没有效果 – Nemo 2014-12-03 08:52:20