1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
package my3d; import java.util.ArrayList; import javafx.animation.AnimationTimer; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.MenuItem; import my3d._slider_dialog.*; public abstract class _viewer3d3 extends _viewer3d2 { @Override public void init_menu() { super.init_menu(); if (!animation_enable) return; anim_dlg = new _slider_dialog(stage, "アニメーション", (values) -> { anim_cycle = Math.pow(10, values[0]); if (!b_anim) { anim_pos = values[1]; repaint(); } }, new _slider_data("周期", 0, 1, Math.log10(anim_cycle)), new _slider_data("位置", 0, 1, anim_pos) ); add_param_menu((index) -> { if (!anim_dlg.isShowing()) anim_dlg.showAndWait(); }, "アニメーション" ); ArrayList<MenuItem> items = add_setting_menu((index) -> { if (b_anim) timer.stop(); else timer.start(); b_anim = !b_anim; }, "cアニメーション" ); setting_anim_menu = (CheckMenuItem)items.get(0); timer = new AnimationTimer() { private long prev_t; @Override public void handle(long t) { if (t - prev_t < 1.0e+9) { anim_pos += (t - prev_t) / (anim_cycle * 1.0e+9); anim_pos -= (int)anim_pos; anim_dlg.init_value_at(1, anim_pos); repaint(); } prev_t = t; } }; } private boolean animation_enable; protected void set_animation_enable(boolean b) { animation_enable = b; } private double anim_cycle = 2, anim_pos = 0; private _slider_dialog anim_dlg; private boolean b_anim; private AnimationTimer timer; private CheckMenuItem setting_anim_menu; protected double get_anim_pos() { return anim_pos; } protected void set_anim_pos(double pos) { if (b_anim) { timer.stop(); b_anim = false; setting_anim_menu.setSelected(false); } anim_pos = pos; anim_dlg.init_value_at(1, pos); repaint(); } }