2014-03-29 5 views
0

SWT Table (JFace TableViewer)에서 이산 (행 단위) 스크롤을 수행하는 방법은 무엇입니까?SWT 표의 이산 스크롤

한 번에 하나의 끊어지지 않은 행을 스크롤하여 전체 셀을 맨 위에 넣으려면 Table이 필요합니다.

나는 JFace는 TableViewer 사용하지만, 나는 그것에 마우스 리스너를 추가 할 수있는 방법을 찾을 수 없었기 때문에이 같은했다 :

TableViewer table = new TableViewer(shell, SWT.BORDER_DASH |SWT.FULL_SELECTION); 
//some visual settings ommited here 
table.getControl().addMouseWheelListener(new MouseWheelListener() { 

     @Override 
     public void mouseScrolled(MouseEvent e) { 
      Table sourceControl = (Table)e.getSource(); 
      System.out.println(e.count); 
      if(e.count >=0) 
       sourceControl.setTopIndex(sourceControl.getTopIndex()-1); 
      else 
       sourceControl.setTopIndex(sourceControl.getTopIndex()+1); 
     } 
    }); 

을하지만, 밝혀졌다 모든 경우의 먼저 e.count이 3 이상이면 일부 행이 누락됩니다. 둘째 가끔 setTopIndex() 행을 올바르게 배치하지 않습니다.

더 정확한 방법으로 처리 할 수 ​​있습니까?

답변

0

e.doit = falseListener에 추가하면 완벽하게 작동합니다. 당신이 Table 테이블의 높이의 끝에 도달 할 때

public static void main(String[] args) 
{ 
    final Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new FillLayout()); 

    final Table table = new Table(shell, SWT.NONE); 

    for (int i = 0; i < 100; i++) 
    { 
     TableItem item = new TableItem(table, SWT.NONE); 
     item.setText("Item " + i); 
    } 

    table.addListener(SWT.MouseWheel, new Listener() 
    { 
     @Override 
     public void handleEvent(Event e) 
     { 
      e.doit = false; 
      if (e.count >= 0) 
       table.setTopIndex(table.getTopIndex() - 1); 
      else 
       table.setTopIndex(table.getTopIndex() + 1); 
     } 
    }); 

    shell.pack(); 
    shell.setSize(shell.getSize().x, 300); 
    shell.open(); 

    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

상단에있는 TableItem가 완전히 표시되지 않는 유일한 경우입니다 TableItem 년대의 정확한 배수가되지 않습니다 다음은 그 예이다 신장.