我是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