JTable은 열 머리글을 표시하지 않습니다.


79

JTable을 인스턴스화하는 다음 코드가 있습니다. 테이블에 올바른 수의 행과 열이 표시되지만 열 위에 제목 표시가 없습니다.

public Panel1()
{
    int  nmbrRows;

    setLayout(null);
    setBackground(Color.magenta);
    Vector colHdrs;

    //create column headers

    colHdrs = new Vector(10);
    colHdrs.addElement(new String("Ticker"));

    // more statements like the above to establish all col. titles       

    nmbrRows = 25;
    DefaultTableModel tblModel = new DefaultTableModel(nmbrRows, colHdrs.size());
    tblModel.setColumnIdentifiers(colHdrs);

    scrTbl = new JTable(tblModel);
    scrTbl.setBounds(25, 50, 950, 600);
    scrTbl.setBackground(Color.gray);
    scrTbl.setRowHeight(23);    
    add(scrTbl);

//rest of constructor
...

}

이것을 다른 테이블 작성 코드와 비교해 보면 빠진 단계는 없지만 뭔가 빠진 것이 분명합니다.

답변:


174

당신 넣어 JTable내부를 JScrollPane. 이 시도:

add(new JScrollPane(scrTbl));

5
이전에이 솔루션을 발견 (및 사용)했지만 이것이 작동하는 이유를 아는 사람이 있는지 궁금 합니다.
Joe Carnahan

17
JScrollPane 상단 구성 요소 (또는 top view 또는 이와 유사한 이름)에 넣은 테이블 헤더 상단 구성 요소가 없으면 JTable은 헤드리스로 표시됩니다. 이것은 의도적으로 설계된 것입니다.
OscarRyz

9
이 링크를 찾았습니다.이 문제를 이해하는 데 도움이 될 수 있습니다. blog.danieldee.com/2009/07/…
Erkan Haspulat

1
또한 JTable 클래스의 "configureEnclosingScrollPane"의 Javadoc에서 :이 JTable이 둘러싸는 JScrollPane (일반적인 상황)의 viewportView 인 경우,이 ScrollPane을 구성하고, 테이블의 tableHeader를 스크롤 창의 columnHeaderView로 설치합니다. new JScrollPane (myTable)을 사용하여 일반적인 방법으로 JTable이 JScrollPane에 추가되면 JTable에서 addNotify가 호출됩니다 (테이블이 뷰포트에 추가 될 때). 이 기본 설치 절차는 하위 클래스에 의해 재정의 될 수 있습니다.
sateesh

1
열 머리글은 별도의 구성 요소 인 JTableHeader에 의해 표시됩니다. JTable이 JScrollPane 안에 있으면 JScrollPane의 열 헤더로 헤더를 자동으로 추가합니다. JScrollPane에 넣지 않으면 헤더를 직접 추가해야합니다 (BorderLayout을 사용하는 것이 가장 좋습니다).
abg

24

이 답변과 허용되는 답변의 주요 차이점은 setViewportView() 대신을 한다는 것입니다add() .

붙이는 방법 JTableJScrollPaneEclipse IDE 를 사용하여 :

  1. JScrollPane디자인 탭을 통해 컨테이너를 만듭니다 .
  2. 스트레치 JScrollPane원하는 크기 (절대 레이아웃에 적용)에.
  3. (뷰포트 영역) JTable위에 컴포넌트를 드래그 앤 드롭 합니다 JScrollPane.

구조> 요소는 table의 자식이어야한다 scrollPane. 여기에 이미지 설명 입력

생성 된 코드는 다음과 같습니다.

JScrollPane scrollPane = new JScrollPane();
...

JTable table = new JTable();
scrollPane.setViewportView(table);

11

이전 답변에서 말했듯이 '일반적인'방법은 JScrollPane에 추가하는 것이지만 때로는 스크롤하지 않기를 원합니다 (언제 묻지 마십시오 :)). 그런 다음 직접 TableHeader를 추가 할 수 있습니다. 이렇게 :

JPanel tablePanel = new JPanel(new BorderLayout());
JTable table = new JTable();
tablePanel.add(table, BorderLayout.CENTER);
tablePanel.add(table.getTableHeader(), BorderLayout.NORTH);

스크롤을 원하지 않는 시간은 테이블에 수직 및 수평으로 많은 양의 데이터가 포함되어있을 때입니다. 이때 (0,0) 위치에서 임의로 스크롤하면 최종 사용자가 어떤 열에 대한 단서도 없게됩니다. 데이터를 주시하고 있습니다.
searchengine27

1
    public table2() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 485, 218);
    setTitle("jtable");
    getContentPane().setLayout(null);

    String data[][] = { { "Row1/1", "Row1/2", "Row1/3" },
            { "Row2/1", "Row2/2", "Row2/3" },
            { "Row3/1", "Row3/2", "Row3/3" },
            { "Row4/1", "Row4/2", "Row4/3" }, };

    String header[] = { "Column 1", "Column 2", "Column 3" };

    // Table
    JTable table = new JTable(data,header);


    // ScrollPane
    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setBounds(36, 37, 407, 79);
    getContentPane().add(scrollPane);

   }

}

이 시도!!


1
getContentPane().add(table);여기서는 의미가 없습니다. 그 외에 :이 답변은 기존 답변과 비교하여 아무것도 추가하지 않습니다.
Marco13 2017-06-17

@chaithra_a이 작업을 수행하는 이유에 대한 자세한 설명을 제공해야합니다.
항공기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.