Я делаю анимацию javaFX, и я сделал следующий класс:
public class Visual extends javax.swing.JFrame implements Runnable {
private static final int JFXPANEL_WIDTH_INT = 360;
private static final int JFXPANEL_HEIGHT_INT = 550;
private static JFXPanel fxContainer;
private static Train train;
private static AtomicBoolean running;
public Visual(Train t) {
Thread thread = new Thread(this);//new thread start
thread.start();
running = new AtomicBoolean(true);
train = t;
this.setSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
this.setTitle(train.getId());
this.setResizable(false);
fxContainer = new JFXPanel();
fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
add(fxContainer, BorderLayout.CENTER);
this.setVisible(true);
addWindowListener(exitListener);
}
@Override
public void run() {
while (train.getRoute() == null && running.get()) {
try {
Thread.sleep(250);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
while (running.get()) {
createScene(train);
try {
Thread.sleep(250);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
//Logger.logException(ex, "");
}
}
}
private static int nbSectors = 0;
private void createScene(Train t) {
if (t.getRoute() != null) {
nbSectors = 0;
for (Block s : t.getRoute().getBlocks()) {
nbSectors += s.getSectors().size();
}
System.out.println("number of sectors : " + t.getId());
Group root = new Group();
Scene scene = new Scene(root, 350, 550, Color.ALICEBLUE);
Line l = new Line(100, 70, 100, 450);
l.setStrokeWidth(4);
l.setStrokeLineCap(StrokeLineCap.ROUND);
int nbStations = t.getLine().stations.size() - 1;
int m = 0;
boolean skipped = false;
for (Block b : t.getRoute().getBlocks()) {
for (Sector s : b.getSectors()) {
if (s.isOccupied()) {
root.getChildren().add(new Circle(100, 70 + m * (380. / nbSectors), 20, Color.RED));
skipped = true;
break;
}
if (skipped) {
break;
}
m++;
}
m++;
}
int i = 0;
// System.out.println("nb de lignes : "+nbLines);
for (Station station : t.getLine().stations) {
root.getChildren().add(new Text(130, 70 + i * (380 / nbStations), station.getId()));
root.getChildren().add(new Circle(100, 70 + i * (380 / nbStations), 10, Color.BLACK));
i++;
}
for (int j = 0; j < nbSectors; j++) {
root.getChildren().add(new Line(95, 70 + j * (380 / nbSectors), 105, 70 + j * (380 / nbSectors)));
}
root.getChildren().add(l);
fxContainer.setScene(scene);
}
}
public final void stop() {
running.set(false);
}
WindowListener exitListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
stop();
}
};
}
Все работает очень хорошо, когда в моем графическом интерфейсе я, например, один new Visual(greenTrain)
.Проблема появляется, когда я запускаю несколько окон визуального.В терминале нет ошибок, но выполняется только последний созданный экземпляр Visual.Остальные раньше просто ничего не делают.И я не понимаю почему, потому что каждый должен быть в другой теме, нет?
спасибо за помощь;)