当我使用javaFX GUI时遇到一些问题,下面的代码是执行时的性能测试,我在javaFX中创建了三万个按钮对象并且摆动。当我执行程序时,用javaFX编写的内存已经占用了700MB,而且它的时间也在增加,但另一个用swing编写的样本只使用120MB内存并没有增加。
这是使用javaFX的代码
public class ManyButtons_JavaFX extends Application{
private static final int ROWS = 300;
private static final int COLS = 100;
public void start( Stage stage ){
stage.setTitle("Many Buttons JavaFX");
stage.setWidth(600);
stage.setHeight(400);
GridPane grid = new GridPane() ;
grid.setHgap(10);
grid.setVgap(10) ;
for( int y = 0 ; y < ROWS ; y++ ){
for( int x = 0 ; x < COLS ; x ++ ) {
grid.add(new Button("Button " + x + "," + y ) , x , y ) ;
}
}
ScrollPane scroll = new ScrollPane(grid) ;
stage.setScene(new Scene(scroll) ) ;
stage.show() ;
}
public static void main( String[] args ){
launch(ManyButtons_JavaFX.class , args) ;
}
这是用摇摆写的
public class ManyButtons_Swing extends JFrame{
private static final int ROWS = 300;
private static final int COLS = 100;
ManyButtons_Swing(){
this.setTitle("Many Buttons Swing");
this.setSize(600,400) ;
JPanel grid = new JPanel(new GridLayout(ROWS , COLS , 10 , 10 )) ;
for( int y = 0 ; y < ROWS ; y++ ){
for( int x = 0 ; x < COLS ; x ++ ) {
grid.add(new JButton("Button " + x + "," + y ) ) ;
}
}
JScrollPane sc = new JScrollPane(grid) ;
this.setContentPane(sc);
this.setVisible(true);
}
public static void main( String[] args ){
new ManyButtons_Swing() ;
}
用javaFX编写的程序总是使用五次或更多次使用swing,并且当对象大幅增加时,执行窗口不能流畅运行(swing是可以的)。 我有什么方法可以优化它吗?
答案 0 :(得分:1)
考虑为每个数据块使用虚拟化控件而不是节点
30,000个按钮很多。一般来说,我不建议在场景中添加数千个节点。相反,我建议您使用虚拟控件,该控件仅创建表示屏幕上可见数据的节点,而不是您拥有的所有可能数据。这就是TableView和ListView等内置控件的工作原理。它们具有单元工厂并且呈现动态单元,其提供对后备数据的视图,并且随着后备数据的改变而不断更新(例如,当用户在ListView中向上和向下滚动时)。这样的策略允许TableView有效地表示其中包含数十万个项目的数据结构。
当您将实现基于GridPane时,与GridPane功能类似的虚拟化控件是ControlsFX GridView。我建议你看一下,看看它是否符合你的需要。