2009-02-27 3 views
0

자바 스윙 GUI가있어서 JScrollPaneJTable과 함께 문제가 발생했습니다. 어떤 이유로 프로그램 실행 중에 테이블 모델의 행 수가 증가하면 JScrollPane이 업데이트되지 않습니다. 즉, 테이블의 높이가 스크롤 뷰 높이를 초과하도록 행이 증가하면 스크롤 창은 예상대로 업데이트되지 않습니다. 새 행은 예상대로 화면에 표시됩니다. 창 크기를 조정하면 스크롤이 예상대로 업데이트됩니다. 나는이 문제를 일으키는 코드 샘플을 제공 할 수 있도록스윙 GUI : JTable이 커질 때 스크롤링되지 않음

수직 스크롤 정책이 테이블 모델 fireTableDataChanged를 호출 VERTICAL_SCROLLBAR_AS_NEEDED입니다 ..

불행하게도 코드는 조금 복잡하다. 그러나 누군가가 바로 몇 가지 아이디어를 가지고 물어 생각 ..

편집이 : 아직도 혼란 좀 더 : 테이블 폭 (뷰 폭 이상은, 수평 스크롤이 즉 수평 스크롤 정책이 HORIZONTAL_SCROLLBAR_AS_NEEDED되며, 경우 경우) 사용이 문제가 발생하지 않습니다 ...

EDIT2 : 문제는 테이블이 스크롤되는 것이 아니라 스크롤 바의 그들이 정상적으로 작동되지 않습니다.

답변

0

흠 ..이 문제에 반환 후 우리 JScrollPane의 행 헤더 커스터마이즈가 문제의 원인이되고있었습니다. (일부 바람직한 크기는별로 가치가없는 값으로 설정되었습니다.)

4

일부 코드를 게시해야 할 수도 있습니다. 난 그냥 다음 테스트를 노크 한과 수직 스크롤이 행의 수는 뷰포트의 높이를 초과 할 때 활성화되는, 즉 같은 광고 작품 : 나는 것을 발견

import java.awt.GridLayout; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.table.AbstractTableModel; 

public class JTableTest { 

    public static void main(String[] args) { 
     final MyTableModel tm = new MyTableModel(); 
     tm.addData(new Data("R1C1", "R1C2")); 

     JTable table = new JTable(tm); 
     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout()); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setSize(400, 150); 
     frame.setVisible(true); 

     Thread t = new Thread(new Runnable() { 
      private int count = 2; 
      public void run() { 
       for (; ;) { 
        tm.addData(new Data("R" + count + "C1", "R" + count + "C2")); 
        count++; 
        try { 
         Thread.sleep(2000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
     t.start(); 
    } 

    private static class MyTableModel extends AbstractTableModel { 
     private List<Data> dataList = new ArrayList<Data>(); 

     public int getColumnCount() { 
      return 2; 
     } 

     public void addData(Data data) { 
      dataList.add(data); 
      fireTableRowsInserted(dataList.size()-1, dataList.size()-1); 
     } 

     public int getRowCount() { 
      return dataList.size(); 
     } 

     public Object getValueAt(int rowIndex, int columnIndex) { 
      Data data = dataList.get(rowIndex); 
      return columnIndex == 0 ? data.data1 : data.data2; 
     } 
    } 

    private static class Data { 
     public String data1; 
     public String data2; 

     public Data(String data1, String data2) { 
      this.data1 = data1; 
      this.data2 = data2; 
     } 
    } 
} 
+0

감사합니다; 마지막 '}'은 코드 섹션 외부에서 잊어 버렸습니다. 하지만 네, 문제가있는 테스트 버전을 만들어야한다고 생각합니다 (또는 버그 수정 방법을 찾으십시오). – Touko

관련 문제