2014-12-01 4 views
0

У меня есть BorderLayout, содержащий View. На левой и правой стороне есть два ImageViews. Я устанавливаю там изображение через ObejctProperty из другого потока. TypedImage - это просто контейнер для изображения javaFXs.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 (зависит от типа) обновляется и отображает изображение в пользовательском интерфейсе. Когда этот метод называют вторым, его второе свойство для второго ImageView. Из этой точки JUST последний обновленный 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

ответ

0

Попробуйте положить путь контроллера в файле 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

Сори, я забыл скопировать это .. он не имеет никакого эффекта – Nemo

Смежные вопросы