2015-04-20 2 views
1

Так вот проблема. После каждого TranslateTransition (tt), я хотел бы изменить расположение Node по setX() и setY(), затем PauseTransition (pt) для второй, и повторно использовать tt из нового местоположения. Но до того, как tt будет работать в новом желаемом месте, кнопка кратковременно мигает на странной координате - точнее, Node был первоначально размещен на (0, 0), а tt перемещает кнопку на 100 пикселей. После каждой последовательности tt =>pt местоположение Node обновляется путем добавления 100 к предыдущей координате x (setX(getX() + 100)) - следующее местоположение, следовательно, (100, 0). Но прежде, чем начать tt на (100, 0), он коротко вспыхивает кнопку (100, 100) - после некоторых усилий для отладки, я узнал, это происходит потому, что в конце предыдущего tt.play(), координата «переехал» из (0, 0) в (0, 100), и, следовательно, когда setX(getX() + 100) используется, он помещает Node в (100, 100) и оставляет его там до следующего tt.play(), после чего Node правильно переместится на (100, 0).JavaFX - Изменение местоположения узла после TranslateTransition

Детали:

Я в Node, более конкретно ImageView на котором Image загружается, что в основном действует как скользящее кнопку на экране. Я использовал TranslateTransition для перемещения по кнопке.

TranslateTransition tt = new TranslateTransition(); 

tt = new TranslateTransition(Duration.seconds(5), button); 
tt.setFromX(0); 
tt.setFromY(0); 
tt.setByX(0); 
tt.setByY(100); // shifts the button down by 100 pixels 
tt.setAutoReverse(true); 

Здесь button относится к ImageView объекта. После выполнения TranslateTransition я хотел бы очистить экран, установив button.setVisible(false) и сохранить пустой экран в течение 3 секунд. Я бы следующее:

PauseTransition pt = new PauseTransition(Duration.seconds(3)); 

tt.setOnFinished((ActionEvent event) -> { 
    tt.stop(); // not really necessary though 
    button.setVisible(false); 
    pt.play(); 
}); 

Потому что я хотел шаблон кнопки перемещения => исчезает и пауза => скользящую кнопку => исчезают, и сделать паузу, чтобы продолжить, я также позволить tt игру, когда pt закончил. Также для обновления местоположения button (новое случайное местоположение) я включил button.setX(rand.nextInt(500)), где Random rand = new Random().

pt.setOnFinished((ActionEvent) -> { 
    button.setX(rand.nextInt(500)); 
    button.setVisible(true); 
    updateButtons(); 
    tt.play(); 
}); 

Я попытался переместить обновление линии setX() как в setOnFinished блок tt и pt, но это, кажется, не вступил в силу.

Так что мой вопрос: после запуска TranslateTransition есть ли способ отменить его действие, чтобы он не влиял на операции setX() и setY()? Для этой цели мое приложение, установив cycle(2) и установив Node невидимым после половины цикла, не является вариантом, потому что я хочу добавить другие функции, зависящие от времени.

ответ

1

я узнал, что это лучшая практика явно remove и addNode на объекты вместо изменения их обзорности с setVisible(boolean).

Поэтому, когда объект Node должен исчезнуть с экрана, это должно быть сделано через root.getChildren().add(node);.Аналогично, когда объекты Node возвращаются на экран, вместо этого следует использовать root.getChildren().remove(node);. Этот подход устраняет проблему.

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