2015-10-05 42 views
2

問題JavaFX的進度條會導致嚴重的窗口滯後調整大小

後,我有一個看起來很好的工作,直到我調整應用程序窗口的任何一箇中型的JavaFX窗口。調整大小後,所有具有下拉或類似操作的組件(即Menu,ComboBox,TabPane)變得非常緩慢。

原因

我已經縮小的問題降到一個進度條,如果我刪除從現場的進度條,我可以調整窗口的大小(S),就像我想,如果我添加它,然後任何窗口調整大小,並且它們在大約半秒時間內開始變得無響應;有時甚至會有兩秒鐘,如果我做了很多調整大小。

窗口

窗口的視圖,以便您可以看到所有的組件。

The window with the progress bar

我不能添加的所有窗口的代碼作爲其根本太多張貼。

類與窗口上的進度條

/** 
* The class that holds and displays the progress bar 
*/ 
public class BottomToolBarImpl extends ToolBar { 

    /** 
    * The label that display the "Waiting for input" text at the bottom of the 
    * window 
    * 
    * The {@code LLabel()} class is a label that gets its text from a 
    * properties file 
    */ 
    private final Label text = new LLabel().setTextKey("waiting").register(); 

    /** 
    * This is the progress bar itself that is causing the problem 
    */ 
    private final ProgressBar progressBar = new ProgressBar(); 

    /** 
    * Constructs the tool bar and adds the components 
    */ 
    public BottomToolBarImpl() { 
     super(); 
     addItems(); 
    } 

    /** 
    * Adds the progress bar and label the this object 
    */ 
    private void addItems() { 
     Region r = new Region(); 
     r.setMaxWidth(Double.MAX_VALUE); 
     HBox.setHgrow(r, Priority.ALWAYS); 

     progressBar.setMinWidth(192);//This line has no effect on the performance 

     this.getItems().add(r); 
     this.getItems().add(text); 
     this.getItems().add(progressBar);//If i comment out this line then all works perfectly 
    } 
} 

附加信息

  • 大部分可見光成分的(即TableViewToolBarListView)是實施方式。我懷疑這是問題

  • 許多廣泛使用的組件,如ButtonsLabels是實現一個接口,允許他們使用一個密鑰,然後從其文本的語言文件中獲取鍵值的實現。這在渲染方面沒有太多的工作,也不經常被調用,所以我也懷疑這是問題所在。

  • 窗口啓動相當快(不到一秒)。

  • 我有一臺遊戲PC,所以我的硬件不應該是一個問題。

  • Java版本:1.8.0_40(建1.8.0_40-B25)64位


我想我要問這裏有什麼身體人有這個問題,如果是的話,你是如何解決它的?
你知道這個問題可能是什麼嗎?我不認爲這是一個錯誤,因爲谷歌沒有任何/許多結果。

任何幫助將不勝感激,因爲我完全卡在這裏。

再現結果

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.control.ToolBar; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.Region; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class Main extends Application { 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     primaryStage.setTitle("Reproduce problem"); 

     final StackPane root = new StackPane(); 
     primaryStage.setScene(new Scene(root, 500, 400)); 

     final VBox layout = new VBox(10); 

     layout.getChildren().addAll(new MenuImpl(), new ProgressToolBar()); 

     root.getChildren().add(layout); 
     primaryStage.show(); 
    } 

    private class ProgressToolBar extends ToolBar { 

     private final Label text = new Label("Random Text Here"); 

     private final ProgressBar progressBar = new ProgressBar(); 

     public ProgressToolBar() { 
      super(); 
      addItems(); 
     } 

     private void addItems() { 
      Region r = new Region(); 
      r.setMaxWidth(Double.MAX_VALUE); 
      HBox.setHgrow(r, Priority.ALWAYS); 

      progressBar.setMinWidth(192); 

      this.getItems().add(r); 
      this.getItems().add(text); 
      this.getItems().add(progressBar); //Still causes the problem 
     } 
    } 

    private class MenuImpl extends MenuBar { 

     public final Menu FILE = new Menu("File", null, new MenuItem("A"), new MenuItem("B"), new MenuItem("C")); 

     public MenuImpl() { 
      super(); 
      this.getMenus().addAll(FILE); 
     } 
    } 
} 

單擊「文件」菜單和之前和調整窗口後,在項目之間滾動的MCVE。

+0

有兩件事情我不清楚:1)你的'addItems()'方法創建一個'Region',但從來沒有使用它。 2)getItems()和add(Node)方法在結果中會發生什麼。請將該代碼添加到問題中。 – hotzst

+0

您可能希望爲此創建[mcve](http://stackoverflow.com/help/mcve)(如果您成功創建一個,您將更有可能獲得幫助)。 – jewelsea

+0

@hotzst該地區已添加。 'this.getItems()。add(r);'將該區域添加到工具欄中的組件列表中。 getItems()方法是ToolBar的一部分,它是工具欄中要顯示的組件上的一個ObservableList。 –

回答

相關問題