在流程面板上添加按钮时,JavaFX Frozen GUI

时间:2018-10-24 11:40:16

标签: java javafx concurrency frozen

如何在不冻结JAVA FX Just like this中的GUI的情况下向流面板添加5000个按钮或标签

为什么我什至需要这么多按钮 好吧,我不需要那么多,但至少不需要500-1000。因为我正在构建一个应用程序Fonticon Tool

慢是可以的,但不能冻结 如果应用程序运行缓慢并且需要花费几秒钟才能显示所有按钮,那是可以的,但是我不希望它冻结进度条和GUI

工作方式 我有一个带有两个表的SQLite database, 每个表都有一个values的列表。一个对象给了我ArrayList值

我在寻找什么 我正在寻找类似的东西。

FlowPane fp = new FlowPane(); 

for(String fonticon_code : DatabaseTable.getlist()) //getlist() returns an array list of Strings
{
  fp.getChildren.add(new button().setGraphic(new FontIcon(fonticon_code)));

}

我也想能够停止并重新启动线程

我累了 我尝试了Thread,Task,Platform.runLater(update); 但我不确定我是否正确使用它们

1 个答案:

答案 0 :(得分:1)

这里有一个MCVE使用ControlsFX GridView

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import org.controlsfx.control.GridCell;
import org.controlsfx.control.GridView;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication287 extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        ObservableList observableList = FXCollections.observableArrayList(Font.getFamilies());
        GridView<String> myGrid = new GridView(observableList);
        myGrid.setHorizontalCellSpacing(0);
        myGrid.setVerticalCellSpacing(0);
        myGrid.setCellFactory(gridView -> {
            return new GridCell<String>()
            {
                Button button = new Button("ABC");

                {
                    button.setPrefWidth(60);
                    button.setPrefHeight(60);
                }

                @Override
                public void updateItem(String item, boolean empty)
                {
                    if (empty || item == null) {
                        setText(null);
                        setGraphic(null);
                    }
                    else {
                        button.setFont(new Font(item, 14));
                        setGraphic(button);
                    }

                }
            };
        });

        StackPane root = new StackPane(myGrid);
        Scene scene = new Scene(root, 500, 700);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

enter image description here