2014-11-25 2 views
3

하나의 열이있는 TableView에 표시되는 유형의 관찰 가능한 목록이 있어야합니다. 선택하면 오른쪽에 나머지 정보가 표시됩니다. TableView는 Accordion으로 랩핑 된 TitledPane에 래핑됩니다. 아래 이미지 참조 :JavaFX 8에서 TableView 열 머리글을 숨기는 방법은 무엇입니까?

enter image description here

이 시나리오에서 볼 수 있듯이 내가 열 머리글을 표시하지 않습니다. 그것은 자바 FX 8 나를 생각하게 메소드가 null를 돌려 룩업 ("TableHeaderRow")에 대한 작동하지 않을 것으로 보인다,

Pane header = (Pane) list.lookup("TableHeaderRow"); 
header.setMaxHeight(0); 
header.setMinHeight(0); 
header.setPrefHeight(0); 
header.setVisible(false); 

을하지만 :

나는 here에 이르게 명령 here을, 다음 시도 "TableHeaderRow"선택자는 더 이상 존재하지 않습니다.

JavaFX 8에서 테이블 헤더를 제거/숨기기위한 업데이트 된 해결 방법이 있습니까?

+2

당신은 당신이 있기 때문에, 대신에'TableView'의'ListView'를 사용할 수 만 한 개의 열이 있습니까? –

+1

** lookup id **가 여전히 JavaFX 8에서 사용 가능한지 확인할 수 있습니다.'list' 참조가'TableView '입니까? – ItachiUchiha

+0

@ James_D 할 수는 있지만 앨범을 선택하면 나머지 앨범 개체를 테이블에서 오른쪽 창으로 전달해야하는 앨범 목록이 있습니다. TableView는 객체와 직접 작동하지만, ListView는 앨범 이름과 객체를 따로 따로 색인화해야합니다. 내가 틀렸다면 나에게 계몽 해주십시오. 고마워요. – user3804927

답변

7

설명에서 볼 수 있듯이 CSS가 노드에 적용될 때까지 조회가 작동하지 않습니다. 일반적으로 노드를 표시하는 첫 번째 프레임 렌더링에 있습니다. 표가 표시된 후에 게시 한 코드를 실행하는 경우 제안 된 솔루션이 제대로 작동합니다.

이 경우보다 나은 방법으로 헤더가없는 단일 열 '테이블'은 단지 ListView입니다. ListViewTableColumn에 사용 된 것과 비슷한 cell rendering mechanism입니다 (그러나 여러 열에 대해 걱정할 필요가 없으므로 더 간단합니다). 내가 대신 헤더 사라지게하기 위해 CSS를 해킹, 시나리오에 ListView을 사용 :

ListView<Album> albumList = new ListView<>(); 
albumList.setCellFactory((ListView<Album> lv) -> 
    new ListCell<Album>() { 
     @Override 
     public void updateItem(Album album, boolean empty) { 
      super.updateItem(album, empty); 
      if (empty) { 
       setText(null); 
      } else { 
       // use whatever data you need from the album 
       // object to get the correct displayed value: 
       setText(album.getTitle()); 
      } 
     } 
    } 
); 

albumList.getSelectionModel().selectedItemProperty() 
    .addListener((ObservableValue<? extends Album> obs, Album oldAlbum, Album selectedAlbum) -> { 
     if (selectedAlbum != null) { 
      // do something with selectedAlbum 
     } 
); 
+0

설명해 주셔서 감사합니다. 셀 팩터 (Cell Factory)에 대해서는 몰랐습니다. 그래서 어떻게 작동하는지 이해하면 더 단순 해 보입니다. 건배! – user3804927

+0

downvoted, 원래 질문에 대답하지 않습니다, 질문에 대답하시기 바랍니다, 그럼 문제를 해결하는 더 나은 방법을 제안 후 upvote, 감사합니다. – Troyseph

+1

실제로 질문에 제기 된 문제를 해결합니다. 헤더가없는 단일 열이 필요하다는 것이 분명합니다. 귀하의 질문이 다른 경우, 새로운 질문으로 질문하십시오. –

3

내가 최근에 열 머리글을 숨기는의 문제를 직면하고 CSS를 사용하여 해결할 수 있습니다.

은 내가 styleclass 생성 :

.noheader .column-header-background { 
    -fx-max-height: 0; 
    -fx-pref-height: 0; 
    -fx-min-height: 0; 
} 

을하고있는 TableView에 추가 :

tableView.getStyleClass().add("noheader"); 

이런 경우에 누군가가 다른 방법이 필요합니다. 또한 열 헤더를 토글 링할 수있는 유연성을 제공합니다.

+0

null을 반환합니다 (tableView 초기화 중에 사용되는 경우). TableView가 렌더링 된 후에 만 ​​호출 할 수 있습니다. – zIronManBox

0

또한 요즘에는 이것을 사용하는 것이 좋습니다. 초기화하는 동안 실행하면

tableView.skinProperty().addListener((a, b, newSkin) -> { TableHeaderRow headerRow = ((TableViewSkinBase) newSkin).getTableHeaderRow(); ... });

는, null를 돌려줍니다, 초기화하는 동안 위의 언급과 같은 다른 방법을 실행할 수 있습니다.

1

CSS 나 스타일 또는 스킨 조작이 필요하지 않습니다. 간단히있는 TableView의 서브 클래스를 만들고이 자바 년 6 월 2017로 잘 작동이

class XTableView extends TableView { 
    @Override 
    public void resize(double width, double height) { 
     super.resize(width, height); 
     Pane header = (Pane) lookup("TableHeaderRow"); 
     header.setMinHeight(0); 
     header.setPrefHeight(0); 
     header.setMaxHeight(0); 
     header.setVisible(false); 
    } 
} 

처럼, 크기를 조정 오버라이드 (override) 8.

관련 문제