gpt4 book ai didi

java - 在 ListView 中选择项目时出现问题 - JavaFX

转载 作者:行者123 更新时间:2023-12-01 21:45:20 27 4
gpt4 key购买 nike

我编写了以下方法,用于在按下按钮时使用react:

private void handlePlayButton(ActionEvent e){
for (int i = 0; i < commands.size(); i++) {
list.getSelectionModel().select(i);

try {
Thread.sleep(1000);
} catch (InterruptedException ie){
System.out.println("Error at handlPlayButton: interruption");
}

}

}

在这段代码中,我尝试选择从第一行开始的每个元素,然后等待 1 秒来选择下一个元素,但看起来它等待 n-1 秒(其中 n 是项目的大小),然后选择最后一项。有什么办法可以解决这个问题吗?

字段listListView<String>顺便说一下。

最佳答案

这个问题相对晦涩难懂,所以我认为该解决方案不适用于其他任何人。基本解决方案是当用户按下 UI 中的“循环”按钮时,使用时间轴自动更新 ListView 中的选择。

有一些额外的逻辑来处理边缘情况,例如如果用户在循环正在进行时修改选择或用户重新启动循环过程该怎么办。如果用户单击当前选定的项目,自动循环不会停止,因此如果原始提问者采用类似的解决方案,他可能希望添加一些自己的代码来执行此操作。

还有一些用于将 ImageView 放置在 ListView 中的逻辑,但这不是应用程序的核心,对于存储在 ListView 中使用的更常见类型(例如字符串)可以忽略。 ImageView 相关的东西只是为了让应用程序看起来更好一点。

fishes

import javafx.animation.*;
import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.util.Arrays;
import java.util.stream.Collectors;

public class RotatingSushiMenu extends Application {

private static final Duration AUTO_CHANGE_PAUSE = Duration.seconds(2);

private boolean autoChange;

@Override
public void start(Stage stage) {
ObservableList<Image> images = FXCollections.observableList(
Arrays.stream(IMAGE_LOCS)
.map(Image::new)
.collect(Collectors.toList())
);

ListView<Image> list = new ListView<>(FXCollections.observableList(images));
list.setCellFactory(param -> new ImageListCell());

Timeline timeline = new Timeline(
new KeyFrame(Duration.ZERO),
new KeyFrame(
AUTO_CHANGE_PAUSE,
e -> {
int curIdx = list.getSelectionModel().getSelectedIndex();
if (curIdx < list.getItems().size() - 1) {
autoChange = true;
list.scrollTo(curIdx + 1);
list.getSelectionModel().select(curIdx + 1);
autoChange = false;
}
}
)
);
timeline.setCycleCount(list.getItems().size());

Button cycle = new Button("Cycle");
cycle.setOnAction(event -> {
if (list.getItems().size() > 0) {
list.scrollTo(0);
list.getSelectionModel().select(0);
timeline.playFromStart();
}
});

list.getSelectionModel().getSelectedItems().addListener((ListChangeListener<Image>) c -> {
if (!autoChange) {
timeline.stop();
}
});

VBox layout = new VBox(10, cycle, list);
layout.setPadding(new Insets(10));
stage.setScene(new Scene(layout));
stage.show();
}

public static void main(String[] args) {
launch(args);
}

private class ImageListCell extends ListCell<Image> {
final ImageView imageView = new ImageView();

ImageListCell() {
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}

@Override
protected void updateItem(Image item, boolean empty) {
super.updateItem(item, empty);

if (empty || item == null) {
imageView.setImage(null);
setText(null);
setGraphic(null);
}

imageView.setImage(item);
setGraphic(imageView);
}
}

// image license: linkware - backlink to http://www.fasticon.com
private static final String[] IMAGE_LOCS = {
"http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Blue-Fish-icon.png",
"http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Red-Fish-icon.png",
"http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Yellow-Fish-icon.png",
"http://icons.iconarchive.com/icons/fasticon/fish-toys/128/Green-Fish-icon.png"
};
}

关于java - 在 ListView 中选择项目时出现问题 - JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36070977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com