2011-01-08 5 views
1

수천 개의 항목이있는 JTable에서 문자열을 찾는 find 함수가 있습니다. Michael Meyers은 친절하게도 함수의 goto 부분을 도와주었습니다. 그래도 버그가있는 것 같습니다 ...Java JTable Goto Row 버그

사용자가 문자열을 검색하면 응용 프로그램이 JTable에서 해당 줄을 올바르게 찾고 하이라이트합니다. 또한 그것에 집중하려고 시도하지만 항상 그런 것은 아닙니다. 때로는 내가 찾고있는 라인의 짧은 10 + 라인을 점프하고 그것을 볼 수 아래로 스크롤해야합니다. 제가 말했듯이,이 JTable에는 수천 개의 항목이 있습니다. 만약 내가 뭔가를 찾고 있다면 스크롤하기가 어렵습니다. 선택한 항목을 보이는 영역의 가운데에 집중시킬 수 있습니까?

if (logs.get(i).getLine().contains(findStr)) 
{ 
    logTable.scrollRectToVisible(logTable.getCellRect(thisPos, 1, true)); // goto 
    logTable.setRowSelectionInterval(thisPos, thisPos);      // highlight 
} 

나는 그것이 어떤 도움이되지만 여기에 JTable의 설정 코드임을 확실하지 않다 :

JTable logTable = new JTable(logTableModel); 
logTable.setShowGrid(true); 
logTable.setShowVerticalLines(true); 
logTable.setShowHorizontalLines(false); 
logTable.setRowSorter(sorter); 
logTable.getSelectionModel().addListSelectionListener(new LogRowListener()); 

JScrollPane scrollPane = new JScrollPane(); 
scrollPane.getViewport().add(logTable); 
scrollPane.setPreferredSize(new Dimension(800, 450)); 
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

감사

편집 하는 것은 다음은 다운로드 할 수있는 링크입니다. jar 파일. 이 파일은 문제를 설명하는 코드의 제한된 버전입니다. 이 버전은 지속적으로 2-3 줄을 뛰어 넘는 것으로 보입니다. 풀 버전에서는 항상 그런 것은 아닙니다.

Demo.jar

이 데모는 여전히 몇 백 라인에도위한 코드

, 그래서 아래 내가 믿는 부분이 관련이있다.

public class Proto extends JFrame implements ActionListener 
{ 
    public Proto() { ... } 

    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
     String command = event.getActionCommand(); 

     if (BUTTON_NEXT_FIND.equals(command)) 
     { 
      findNext(); 
     } 
    } 

    ...   

    private void findNext() 
    { 
     String findStr = findField.getText(); 

     int pos = selectedLogRow; 

     // if we're searching for the same string again step forward once 
     if (pos == lastFoundPos) 
      ++pos; 

     // search through the log for the string 
     while (pos < logs.size()) 
     { 
      if (logs.get(pos).getLine().contains(findStr)) 
      { 
       logTable.scrollRectToVisible(logTable.getCellRect(pos, 1, true)); 
       logTable.setRowSelectionInterval(pos, pos); 
       lastFoundPos = pos; 
       break;  
      } 
      ++pos; 
     } 
    } 

    ... 
} 

답변

0

때로는 10 + 내가 찾고 있어요 라인의 짧은 선을 이동합니다 나는 그것을보기 위해 아래로 스크롤해야합니다.

문제를 나타내는 SSCCE을 게시하십시오. 수천 개의 행이있는 테이블을 만든 다음 setValueAt (...) 메서드를 사용하여 검색중인 텍스트로 임의의 셀을 채 웁니다.

선택한 항목을 보이는 영역의 가운데에 집중시킬 수 있습니까?

스크롤 할 행 번호를 조정해야합니다. 즉, 행 번호에서 "x"를 빼야 할 때 뷰포트가 텍스트가있는 행 앞의 행에 위치하도록 검색하면됩니다.

+0

나는 전체 코드를 게시하지 않았으며 사용자 정의 TableModel과 CustomRendorers를 추가하는 데 관여했습니다. 그러나 문제를 설명하고 전체 찾기 기능을 게시 한 응용 프로그램의 트림 된 버전. UI 요소 이외의 코드는 더 이상 존재하지 않지만, 다른 것을 원한다면 알려주십시오. – linsek

+0

@njozwiak, 왜 사용자 정의 TableModel과 렌더러를 포함해야합니까? 그것들이 문제의 원인입니까? 1000 행의 테이블을 작성하는 데는 한 줄의 코드가 필요합니다. new JTable (1000, 3); 다양한 행에 대해 몇 가지 값을 설정하는 또 다른 몇 줄의 코드가 필요합니다. 그런 다음 테이블을 프레임에 추가합니다. 그런 다음 검색 버튼과 코드를 추가합니다. SSCCE는 약 20-30 줄의 코드 여야합니다. scrollRectToVisible()이 예상대로 작동한다는 개념 증명을 위해 SSCCE를 만듭니다. 게시 한 코드는 실행 가능하지 않으므로 도움이되지 않습니다. – camickr