У меня есть рабочая система, в которой один пользовательский компонент может быть обновлен нажатием кнопки пользователя или таймером.Но я не уверен, что это самый эффективный способ, и если он потокобезопасен.
Есть ли лучший способ решить эту проблему?
У меня есть компонент, основанный на Canvas: класс MyBox Oneкоторый содержит данные: MyColorBox Интерфейс прослушивания: MyColorBoxListener
Из основного класса:
pane.getChildren().add( new MyBox( myboxdata));
Данные могут обновляться таймерами или щелчком пользователя по телефону:
myboxdata.update();
Пользователь может выбрать Play, Stop или Next.Play и Stop будут управлять таймером.Если таймер остановлен, можно будет нажать Далее.
Мой класс данных:
import javafx.scene.paint.Color;
public class MyColorBox {
Color color[] = new Color[]{Color.BLUE, Color.RED, Color.GREEN};
Color color_second;
int counter = 0;
MyColorBoxListener listener;
public MyColorBox(MyColorBoxListener listener) {
this.listener = listener;
}
public MyColorBox() {
setListener(null);
}
public void setListener(MyColorBoxListener listener) {
this.listener = listener;
}
public void update() {
if(++counter>=color.length) counter=0;
if(listener!=null)
listener.updated();
}
public Color getCurrentColor() {
return color[counter];
}
}
Интерфейс прослушивателя:
public interface BouncingBoxListener {
public void updated();
}
Мой компонент:
public class MyBox extends Canvas implements MyColorBoxListener {
MyColorBox box;
public MyBox( MyColorBox box) {
super(100,100);
this.box = box;
box.setListener(this);
draw();
}
public void draw() {
GraphicsContext gc = this.getGraphicsContext2D();
gc.setStroke( box.getCurrentColor());
gc.setLineWidth(2);
gc.strokeRect(0,0, this.getWidth(), this.getHeight());
}
@Override
public void updated() {
draw();
}
}