У меня есть 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>
Вы можете оставить [MCVE] (http://stackoverflow.com/help/mcve), так что я могу иметь лучшее понимание вашей проблемы? – ItachiUchiha