사용자 항목이있는 테이블로 ScrollPane 내부의 GridPane을 사용하고 있습니다. 각 행에는 사용자 이름 (레이블), 상태 (ImageView)를 나타내는 아이콘 및 두 개의 버튼이 있으며 두 번째 버튼은 사용자 항목을 삭제하는 데 사용됩니다. 두 이미지는 아래 이전과 사용자 항목 삭제 후 스크롤 창을 묘사JavaFX : 행 삭제 후 GridPane을 업데이트하는 가장 좋은 방법은 무엇입니까?
UPDATE : 아래 코드 샘플 :
명백한 문제는 GridPane 항목이 없다는 것입니다 자동으로 재 배열되고 삭제 된 선은 여전히 공간을 차지합니다. 수동으로 재배치하는 방법을 제공해야합니까? 아니면 그것에 대해 손쉬운 방법이 있습니까?
for (NonSudoUser nsuser : nonSudoUsers) { // the users I want to show in the gridpane
// user row
RowConstraints row = new RowConstraints(30);
gridPaneNonSudoUsers.getRowConstraints().add(row);
// code that adds username label, status icon, checkstatus button - irrelevant I think to our issue
// adding delete user button now:
Button btnDeleteUser = new Button("Delete User");
btnDeleteUser.setId("btnDel"+username); // explained below
// delete user in a seperate thread
btnDeleteUser.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// confirmation dialog here - omitted for brevity
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
String username = ((Button) event.getSource()).getId();
LinuxCommand lc = new LinuxCommand("userdel", "-r", username);
lc.execute();
return null;
}
};
task.setOnFailed(new EventHandler<WorkerStateEvent>() {
public void handle(WorkerStateEvent t) {
System.out.println("FAILURE deleting " + username);
}
});
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
public void handle(WorkerStateEvent t) {
Platform.runLater(new Task<Void>() {
@Override
public Void call() throws Exception {
ArrayList<Node> toErase = new ArrayList<Node>();
for (Node nodeToErase: gridPaneNonSudoUsers.getChildren()) {
if (nodeToErase.getId().endsWith(username)) // explaind below
toErase.add(nodeToErase);
}
gridPaneNonSudoUsers.getChildren().removeAll(toErase);
return null;
}
});
}
});
executorUserDeletion.submit(task);
요소 ID가 사용자 이름이 예를 들어 testuser0 항목을 포함하는 GridPane의 행과 요소들로 구성되어 그래서, 나는 실제 사용자 이름을 추가합니다. 요소 추가시 (삭제되는 요소를 아는 것입니다 포함 날씨를 확인 라인 다음 ID는 :. lbltestuser0, imgtestuser0, btnCheckStatustestuser0는 btnDeleteUsertestuser0 LinuxCommand는 각각의 명령을 실행하려면 생성자에서 가변 인자의 문자열을 허용하는 사용자 정의 클래스입니다 (다만 스스로 발견 할 때마다 삭제하는 줄 알고)
일부 코드를 표시 할 수 있습니까? –
문제는 단순히 고정 된 높이의 행 제약이 여전히있을 수 있다고 생각합니다. 행을 삭제할 때 행 제약 조건을 제거해보십시오. 실제로 모든 후속 행에 대해 행 인덱스를 통과시켜야 할 수도 있습니다. (이것은'GridPane'보다는'TableView'에 대해 울부 짖는 것처럼 느껴집니다 ...) 또 다른 옵션은 행 제약을 모두 없애고 CSS를 사용하여 노드에 추가로 수직 패딩을 추가하는 것입니다. 그리드 구획. –
많은 감사합니다. 정확하게 문제였습니다. 나는'RoWConstraints'가 없으면 그것을 시도했고 업데이트가 완료되었습니다. 나는 명시 적'RowConstraints' 제거의 해결책에 대해 생각했지만'.setId()'메쏘드가 없다면 각'RowConstraints' 객체에 대한 참조를 얻는 방법을 알아낼 수 없었습니다 – pkaramol