JavaFXListView

JavaFXListView,java,javafx,Java,Javafx,我有一个列表视图列表。我可以使用以下代码通过按钮轻松获取ListView中的下一项: public void toNext(){ list.getSelectionModel().selectNext(); } 但是如果我想用一个按钮自动浏览ListView,它将无法工作。我尝试了以下代码: public void play(){ try { for (int i = 0; i < list.getItems().size() ; i++) {

我有一个
列表视图列表
。我可以使用以下代码通过按钮轻松获取ListView中的下一项:

 public void toNext(){
    list.getSelectionModel().selectNext();
 }
但是如果我想用一个按钮自动浏览ListView,它将无法工作。我尝试了以下代码:

 public void play(){
    try {
        for (int i = 0; i < list.getItems().size() ; i++) {
            list.getSelectionModel().select(i);
            Thread.sleep(500);
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
 }
public void play(){
试一试{
对于(int i=0;i

这段代码不选择列表中的不同字符串,只跳到给定等待时间后的最后一个字符串。如何让它以500毫秒的延迟选择列表中的每个字符串?

您必须在UI线程中包装使UI更新的调用,否则所有更新都在末尾的一组中完成,因此它会跳到列表的末尾

 public void play(){
    try {
        for (int i = 0; i < list.getItems().size() ; i++) {
            final int index = i;
            Platform.runLater(() -> {
                list.getSelectionModel().select(index)
            });
            Thread.sleep(500);
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
 }
public void play(){
试一试{
对于(int i=0;i{
list.getSelectionModel().select(索引)
});
睡眠(500);
}
}捕获(中断异常例外){
例如printStackTrace();
}
}

您必须在UI线程中包装使UI更新的调用,否则所有更新都在末尾的一组中完成,因此它会跳到列表的末尾

 public void play(){
    try {
        for (int i = 0; i < list.getItems().size() ; i++) {
            final int index = i;
            Platform.runLater(() -> {
                list.getSelectionModel().select(index)
            });
            Thread.sleep(500);
        }
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
 }
public void play(){
试一试{
对于(int i=0;i{
list.getSelectionModel().select(索引)
});
睡眠(500);
}
}捕获(中断异常例外){
例如printStackTrace();
}
}

问题是,您的循环完全在FXApplicationRead中运行。
因此,UI在循环期间不会更新

最好是这样:

public void play(){
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < lijst.getItems().size(); i++) {
                final int idx = i;
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        lijst.getSelectionModel().select(idx);
                    }
                });
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

            }
        }
    });
    t.start();
}
public void play(){
线程t=新线程(新的可运行线程(){
@凌驾
公开募捐{
对于(int i=0;i
问题是,您的循环完全在FXApplicationRead中运行。
因此,UI在循环期间不会更新

最好是这样:

public void play(){
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < lijst.getItems().size(); i++) {
                final int idx = i;
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        lijst.getSelectionModel().select(idx);
                    }
                });
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

            }
        }
    });
    t.start();
}
public void play(){
线程t=新线程(新的可运行线程(){
@凌驾
公开募捐{
对于(int i=0;i
考虑使用动画:

Timeline animation = new Timeline(
    new KeyFrame(Duration.millis(500), e -> list.getSelectionModel().selectNext()));
list.getSelectionModel().select(0);
animation.setCycleCount(list.getItems().size()-1);
animation.play();
这种方法的优点包括

  • 它是轻量级的,并且不涉及创建新的执行线程。它只是挂接到现有的FX应用程序线程和脉冲机制中
  • 代码更清晰
  • 它有额外的内置API,因此停止或暂停动画要比创建新线程来管理动画容易得多

  • 考虑使用动画:

    Timeline animation = new Timeline(
        new KeyFrame(Duration.millis(500), e -> list.getSelectionModel().selectNext()));
    list.getSelectionModel().select(0);
    animation.setCycleCount(list.getItems().size()-1);
    animation.play();
    
    这种方法的优点包括

  • 它是轻量级的,并且不涉及创建新的执行线程。它只是挂接到现有的FX应用程序线程和脉冲机制中
  • 代码更清晰
  • 它有额外的内置API,因此停止或暂停动画要比创建新线程来管理动画容易得多

  • 这可能是因为您没有调用
    lijst.getSelectionModel().select(i)
    在UI线程中,意味着不在UI线程上调用play,因为它不应该被调用。很抱歉,这只是一个输入错误,但这不是问题所在;)@这可能是因为您没有调用
    lijst.getSelectionModel().select(i)
    在UI线程中,意味着不在UI线程上调用play,因为它不应该被调用。很抱歉,这只是一个输入错误,但这不是问题所在;)@hotzstIt将等待500毫秒,然后选择第一个和最后一个,但中间的不会被选择…它将等待500毫秒,然后选择第一个和最后一个,但中间的不会被选择。。。