2

ユーザーエントリを持つテーブルとして GridPane (ScrollPane 内) を使用しています。各行には、ユーザー名 (Label)、その状態を示すアイコン (ImageView)、および 2 つのボタン (2 つ目のボタンはユーザー エントリを削除するために使用されます) が組み込まれています。以下の 2 つの画像は、ユーザー エントリの削除前後のスクロール ペインを示しています。

行(ユーザーエントリ)削除前のGridPane

行 (ユーザー エントリ) の削除後の GridPane

更新: 以下のコードサンプル:

明らかな問題は、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 を受け入れてそれぞれのコマンドを実行するカスタム クラスです。

4

1 に答える 1