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.