後,我有一個看起來很好的工作,直到我調整應用程序窗口的任何一箇中型的JavaFX窗口。調整大小後,所有具有下拉或類似操作的組件(即Menu
,ComboBox
,TabPane
)變得非常緩慢。
原因
我已經縮小的問題降到一個進度條,如果我刪除從現場的進度條,我可以調整窗口的大小(S),就像我想,如果我添加它,然後任何窗口調整大小,並且它們在大約半秒時間內開始變得無響應;有時甚至會有兩秒鐘,如果我做了很多調整大小。
窗口
窗口的視圖,以便您可以看到所有的組件。
我不能添加的所有窗口的代碼作爲其根本太多張貼。
類與窗口上的進度條
/**
* 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
}
}
附加信息
大部分可見光成分的(即
TableView
,ToolBar
,ListView
)是實施方式。我懷疑這是問題許多廣泛使用的組件,如
Buttons
和Labels
是實現一個接口,允許他們使用一個密鑰,然後從其文本的語言文件中獲取鍵值的實現。這在渲染方面沒有太多的工作,也不經常被調用,所以我也懷疑這是問題所在。窗口啓動相當快(不到一秒)。
我有一臺遊戲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。
有兩件事情我不清楚:1)你的'addItems()'方法創建一個'Region',但從來沒有使用它。 2)getItems()和add(Node)方法在結果中會發生什麼。請將該代碼添加到問題中。 – hotzst
您可能希望爲此創建[mcve](http://stackoverflow.com/help/mcve)(如果您成功創建一個,您將更有可能獲得幫助)。 – jewelsea
@hotzst該地區已添加。 'this.getItems()。add(r);'將該區域添加到工具欄中的組件列表中。 getItems()方法是ToolBar的一部分,它是工具欄中要顯示的組件上的一個ObservableList。 –