ユーザーエントリを持つテーブルとして GridPane (ScrollPane 内) を使用しています。各行には、ユーザー名 (Label)、その状態を示すアイコン (ImageView)、および 2 つのボタン (2 つ目のボタンはユーザー エントリを削除するために使用されます) が組み込まれています。以下の 2 つの画像は、ユーザー エントリの削除前後のスクロール ペインを示しています。
更新: 以下のコードサンプル:
明らかな問題は、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 は、コンストラクターで vararg String を受け入れてそれぞれのコマンドを実行するカスタム クラスです。