2014-10-16 21 views
2

사용자 항목이있는 테이블로 ScrollPane 내부의 GridPane을 사용하고 있습니다. 각 행에는 사용자 이름 (레이블), 상태 (ImageView)를 나타내는 아이콘 및 두 개의 버튼이 있으며 두 번째 버튼은 사용자 항목을 삭제하는 데 사용됩니다. 두 이미지는 아래 이전과 사용자 항목 삭제 후 스크롤 창을 묘사JavaFX : 행 삭제 후 GridPane을 업데이트하는 가장 좋은 방법은 무엇입니까?

GridPane before row (user entry) deletion

GridPane after row (user entry) deletion

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는 각각의 명령을 실행하려면 생성자에서 가변 인자의 문자열을 허용하는 사용자 정의 클래스입니다 (다만 스스로 발견 할 때마다 삭제하는 줄 알고)

+0

일부 코드를 표시 할 수 있습니까? –

+2

문제는 단순히 고정 된 높이의 행 제약이 여전히있을 수 있다고 생각합니다. 행을 삭제할 때 행 제약 조건을 제거해보십시오. 실제로 모든 후속 행에 대해 행 인덱스를 통과시켜야 할 수도 있습니다. (이것은'GridPane'보다는'TableView'에 대해 울부 짖는 것처럼 느껴집니다 ...) 또 다른 옵션은 행 제약을 모두 없애고 CSS를 사용하여 노드에 추가로 수직 패딩을 추가하는 것입니다. 그리드 구획. –

+0

많은 감사합니다. 정확하게 문제였습니다. 나는'RoWConstraints'가 없으면 그것을 시도했고 업데이트가 완료되었습니다. 나는 명시 적'RowConstraints' 제거의 해결책에 대해 생각했지만'.setId()'메쏘드가 없다면 각'RowConstraints' 객체에 대한 참조를 얻는 방법을 알아낼 수 없었습니다 – pkaramol

답변

0

. setVisible (false) 및 setManaged (false)를 함께 사용할 수 있습니다. applie d 작업을 삭제하는 행 요소가 호출되지만 그리드 선이 서로 겹쳐져 많은 행이 삭제되면 더 어둡고 진한 그리드 선이 표시됩니다. 그러나 GUI 기능으로 사용하지 않는다면 문제가 발생하지는 않습니다.

관련 문제