在流面板上添加按钮时JavaFX冻结GUI

在流面板上添加按钮时JavaFX冻结GUI,java,javafx,concurrency,Java,Javafx,Concurrency,如何在JAVA FX中向flow panel添加5000个按钮或标签而不冻结GUI 为什么我需要这么多按钮 嗯,我不需要那么多,但至少需要500-1000。因为我正在构建一个应用程序 慢速可以,但不能冻结 如果应用程序运行缓慢,需要几秒钟才能显示所有按钮,这没关系,但我不希望它冻结进度条和GUI 它的工作原理 我有一个SQLite和几个表, 每个表都有一个列表。对象给我ArrayList值 我在找什么 我在找类似的东西 FlowPane fp = new FlowPane(); for(St

如何在JAVA FX中向flow panel添加5000个按钮或标签而不冻结GUI

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

慢速可以,但不能冻结 如果应用程序运行缓慢,需要几秒钟才能显示所有按钮,这没关系,但我不希望它冻结进度条和GUI

它的工作原理 我有一个SQLite和几个表, 每个表都有一个列表。对象给我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)));

}
我也希望能够停止和重新启动线程

我累了什么 我尝试了线程、任务、平台.runLater(更新); 但是我不确定我是否正确地使用了它们

导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.StackPane;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
导入org.controlsfx.control.GridCell;
导入org.controlsfx.control.GridView;
/**
*
*@author blj0011
*/
公共类JavaFXApplication287扩展了应用程序
{
@凌驾
公共无效开始(阶段primaryStage)
{
ObservableList ObservableList=FXCollections.observableArrayList(Font.getFamilies());
GridView myGrid=新的GridView(observableList);
myGrid.setHorizontalCellSpacing(0);
myGrid.setVerticalCellSpacing(0);
myGrid.setCellFactory(gridView->{
返回新的GridCell()
{
按钮按钮=新按钮(“ABC”);
{
按钮。设置预宽(60);
按钮。设置高度(60);
}
@凌驾
public void updateItem(字符串项,布尔值为空)
{
if(空| |项==null){
setText(空);
设置图形(空);
}
否则{
按钮。设置字体(新字体(第14项));
设置图形(按钮);
}
}
};
});
StackPane root=新的StackPane(myGrid);
场景=新场景(根,500700);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args)
{
发射(args);
}
}

嗨,Ash,如果你发布了整个程序,回答这个问题会很有帮助。欢迎来到SO!请提供一个演示问题的示例。为什么需要5000个按钮?你的截图中甚至没有显示100个。您最好使用一些虚拟化控件,例如。创建和布局5000个节点不可避免地需要相当长的时间,而且
GridView
会将创建的单元格数量减少到可见的单元格数量。@fabian我正在构建一个应用程序,它需要在流程窗格上设置数百个按钮。你为什么要问?当调整窗口大小时,FlowPane中的所有内容都会自动重新排列Use
GridView
,正如@fabian所建议的。哇,我从来都不知道我们可以像图中所示那样做。非常感谢你抽出时间来尝试。但我的问题是关于JavaFXUI更新线程。我想在其他线程中添加一个按钮到流面板。不冻everything@Ash我把答案改大了一点。使用
按钮
而不是
标签
。我觉得有趣的是,大多数评论都建议您放弃正在做的事情,使用一些虚拟化控件。然而,你坚持做你正在做的事情。你的问题可能不是你想的那样。可能只是你采取了错误的方法。谢谢你的帮助,伙计
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);
    }

}