JavaFX TableView冻结了一段时间的屏幕

时间:2015-12-07 23:04:40

标签: javafx javafx-2 javafx-8 freeze

我是JavaFX的新手,遇到了奇怪的行为,首先我会展示我的代码

public class FreezeFX extends Application {

private VBox root;
private HBox btnContainer;
private Button addBtn, removeBtn;
private TableView<Action> actionsTable;
private TableColumn<Action, String> keywordCol, pathCol;
private ObservableList<FreezeFX.Action> actionList;

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

@Override
public void start(Stage primaryStage) throws Exception {
    setupUI(primaryStage);
    bindData();
    primaryStage.show();
}

private void setupUI(Stage stage) {
    root = new VBox(10);
    root.setPadding(new Insets(10));
    btnContainer = new HBox(10);

    addBtn = new Button();
    addBtn.setText("Add Keyword");
    removeBtn = new Button("Remove Keyword");
    btnContainer.getChildren().addAll(addBtn, removeBtn);
    root.getChildren().add(btnContainer);

    actionsTable = new TableView<Action>();
    keywordCol = new TableColumn<Action, String>();
    keywordCol.setText("Keyword");
    keywordCol.setCellValueFactory(new PropertyValueFactory<Action, String>("keyword"));
    keywordCol.setPrefWidth(138);
    pathCol = new TableColumn<Action, String>();
    pathCol.setText("Path");
    pathCol.setCellValueFactory(new PropertyValueFactory<Action, String>("path"));
    pathCol.setPrefWidth(340);
    actionsTable.getColumns().addAll(keywordCol, pathCol);
    root.getChildren().add(actionsTable); 

    Scene scene = new Scene(root, 500, 500);
    stage.setScene(scene);
    stage.setTitle("Remote PC");
}

private void bindData(){
    actionList = FXCollections.observableArrayList();
    Action a1 = new Action("internet", "path1");
    Action a2 = new Action("winrar", "path2");
    actionList.addAll(a1,a2);
    actionsTable.setItems(actionList);
}

public class Action{
    private String keyword;
    private String path;

    public Action(String keyword, String path) {
        this.keyword = keyword;
        this.path = path;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
}

}

没有TableView,一切正常,当我将TableView添加到我的场景时我遇到屏幕冻结(大约2秒)然后我收到来自Windows(Windows 10)的通知说“屏幕控制器停止响应但是正在工作再次“(我自己从波兰语翻译;))几乎每次我运行程序(是的,差不多,像10次中的9次)。控制台中没有任何错误,当我在应用程序窗口中单击按钮,表格,标签等时出现问题。点击之前,应用程序工作正常,它是服务器应用程序的类型,它能够从客户端和更新UI接收消息,当我点击我之前提到的东西时,一切都崩溃了。 正如我所说,如果我没有将TableView添加到我的场景中,一切正常。 在此先感谢您的帮助

--- --- EDIT 所以我更新了上面的代码,只需要很少的代码来重现问题。我也注意到了:

1)如果我不向根添加btnContainer,一切正常

2)如果我将btnContainer添加到根目录,就像在上面的代码中一样,但是在这一行actionsTable.setItems(actionList);下移动这一行actionList = FXCollections.observableArrayList();一切都会工作,但是tableView没有刷新它的内容

--- --- EDIT2

3)如果我首先添加actionsTable而不是btnContainer它正在工作,并且actionsTable在需要时自行更新

我在东芝S55-85312上使用Intel HD Graphics 4600运行Windows 10

0 个答案:

没有答案