当前位置: 首页 > 知识库问答 >
问题:

点击并按住鼠标按钮,JavaFX微调器的更改很慢

长孙景焕
2023-03-14

单击并按住向上/向下箭头按钮时,微调器更新的速度很慢。有没有办法提高更换速度?

当我用鼠标单击、单击、单击时,旋转器值的变化和我单击一样快。如果我每次按下键盘上的上/下箭头,或者如果我按住上/下箭头键,它也会快速变化。我希望当我单击并按住箭头按钮时,值能快速更改。

有人知道怎么做吗?

共有3个答案

轩辕阳焱
2023-03-14

对费边的回答有一点改进。对鼠标进行以下修改将停止单击与微调器关联的文本字段时引起的NullPointerException。为费边干杯!

    spinner.addEventFilter(MouseEvent.MOUSE_RELEASED, evt -> {
        Node node = evt.getPickResult().getIntersectedNode();
        if (node.getStyleClass().contains("increment-arrow-button") ||
            node.getStyleClass().contains("decrement-arrow-button")) {
                if (evt.getButton() == MouseButton.PRIMARY) {
                    handler.stop();
                }
        }
    });
龚浩宕
2023-03-14

我稍微修改了fabian的答案,以便在按住鼠标的同时降低旋转器的速度:

private int currentFrame = 0;
private int previousFrame = 0;        

@Override
public void handle(long now)
{
    if (now - startTimestamp >= initialDelay)
        {
        // Single or holded mouse click
        if (currentFrame == previousFrame || currentFrame % 10 == 0)
        {
            if (increment)
            {
                spinner.increment();
            }
            else
            {
                spinner.decrement();
            }
        }
    }

    ++currentFrame;
}

停止计时器后,我们再次调整前一帧:

public void stop()
{
    previousFrame = currentFrame;

    [...]
}
贡俊
2023-03-14

SpinnerSkinSpinnerBehavior每750毫秒触发一次更新。不幸的是,如果不使用反射访问private成员,就无法简单地设置/修改此行为。因此,在没有反射的情况下执行此操作的唯一方法是使用事件筛选器以更快的速度触发更新:

private static final PseudoClass PRESSED = PseudoClass.getPseudoClass("pressed");

@Override
public void start(Stage primaryStage) {
    Spinner<Integer> spinner = new Spinner(Integer.MIN_VALUE, Integer.MAX_VALUE, 0);

    class IncrementHandler implements EventHandler<MouseEvent> {

        private Spinner spinner;
        private boolean increment;
        private long startTimestamp;

        private static final long DELAY = 1000l * 1000L * 750L; // 0.75 sec
        private Node button;

        private final AnimationTimer timer = new AnimationTimer() {

            @Override
            public void handle(long now) {
                if (now - startTimestamp >= DELAY) {
                    // trigger updates every frame once the initial delay is over
                    if (increment) {
                        spinner.increment();
                    } else {
                        spinner.decrement();
                    }
                }
            }
        };

        @Override
        public void handle(MouseEvent event) {
            if (event.getButton() == MouseButton.PRIMARY) {
                Spinner source = (Spinner) event.getSource();
                Node node = event.getPickResult().getIntersectedNode();

                Boolean increment = null;
                // find which kind of button was pressed and if one was pressed
                while (increment == null && node != source) {
                    if (node.getStyleClass().contains("increment-arrow-button")) {
                        increment = Boolean.TRUE;
                    } else if (node.getStyleClass().contains("decrement-arrow-button")) {
                        increment = Boolean.FALSE;
                    } else {
                        node = node.getParent();
                    }
                }
                if (increment != null) {
                    event.consume();
                    source.requestFocus();
                    spinner = source;
                    this.increment = increment;

                    // timestamp to calculate the delay
                    startTimestamp = System.nanoTime();

                    button = node;

                    // update for css styling
                    node.pseudoClassStateChanged(PRESSED, true);

                    // first value update
                    timer.handle(startTimestamp + DELAY);

                    // trigger timer for more updates later
                    timer.start();
                }
            }
        }

        public void stop() {
            timer.stop();
            button.pseudoClassStateChanged(PRESSED, false);
            button = null;
            spinner = null;
        }
    }

    IncrementHandler handler = new IncrementHandler();
    spinner.addEventFilter(MouseEvent.MOUSE_PRESSED, handler);
    spinner.addEventFilter(MouseEvent.MOUSE_RELEASED, evt -> {
        if (evt.getButton() == MouseButton.PRIMARY) {
            handler.stop();
        }
    });

    Scene scene = new Scene(spinner);

    primaryStage.setScene(scene);
    primaryStage.show();
}       
 类似资料:
  • 问题内容: 我正在开发JavaFX项目,并且需要类似于表征 “按下并按住”事件的东西 。但是应该将其映射为一个,因为我在Linux上的触摸事件遇到了麻烦。例如,在Ubuntu中,它不会响应触摸事件。 请让我知道,如果你对如何触发一个任何想法 每当 “按住” 在Linux上出现? 问题答案: 只需将a 用作“保持”的计时器即可。如果按下鼠标,则将其启动;如果释放或拖动,则将其停止。

  • 问题内容: 可以更改按钮功能吗? 例如 点击,再点击一次 我已经尝试过类似,但没有结果。 我设法使叠加工作并在其中插入所需的数据。但是没有找到任何可以帮助我的帖子。我正在使用react-bootstrap。这是我的代码。 问题答案: 您可以尝试使用状态来存储颜色。也许这会让您想到解决问题的方法: 这是一个小提琴。

  • 问题内容: 我的手势有点麻烦。 我正在尝试在同一个按钮上同时使用水龙头和长按,所以我已经使用了 和 但是当我点击时,我的按钮似乎对这两种功能都有反应。可能是什么问题? 问题答案: 很难说什么与您的代码不兼容,仅提供了两行,但是我建议您以这种方式进行: 为按钮创建插座 然后将手势添加到按钮中 然后创建动作来处理水龙头 Swift 3.0版本: Swift 5.x的更新语法:

  • 我正在使用和这里找到的自定义表模型。我已经用那篇文章中提供的建议更新了我的代码,遇到了一个新问题。我对代码所做的更改是注入<code>ArrayList 用于初始化< code>JTable的代码如下: 我用来更新< code>JTable的代码如下: 我也尝试过使用但这也不起作用。截至目前,使更新的唯一方法是关闭并重新打开程序。具有我用于的,随着用户添加更多玩家,其大小会增加。 为什么< cod

  • 如何在无限次或动态地单击按钮时添加新的?或者简单地说,如何执行添加更多按钮的功能? 我在Javafx中尝试过,但它只是在列表中添加了两个按钮。 但我必须动态添加,直到用户想要添加/按下上一个按钮

  • 问题内容: 如何通过单击按钮时的Javascript 更改标签的属性值? 问题答案: 如果没有,则单击将重新加载当前页面,因此您需要执行以下操作: 或防止这样的滚动: 或在您的函数中: ....或者不打扰的方式: