2017-05-23 5 views
0

JTableJScrollPane으로 싸여 있습니다. 위쪽 또는 아래쪽으로 스크롤하여 스크롤을 계속할 때, 너무 비싸기 때문에 모든 항목을 한 번에로드 할 수 없기 때문에 처음 또는 끝 부분에 더 많은 항목을로드 할 수 있도록 검색 할 수 있어야합니다. AdjustmentListenerJScrollPane가 움직이지 않을 때 해고되지 않는 (는 상단 또는 하단에 이미있는 경우 예) : 그러나JScrollPane 스크롤 한도에 도달했습니다.

scrollPane.getVerticalScrollBar().addAdjustmentListener(adjustmentEvent -> 
{ 
    int value = adjustmentEvent.getValue(); 
    System.out.println(value); // Prints 0 e.g. when the top has been reached 
}); 

, 내가 말/시작이 이미 된 경우에도 때 사용자가 스크롤을 알 필요가 도달했습니다.

어떻게이 작업을 수행 할 수 있습니까?

+0

창의 위치를 ​​가져 와서 창 크기와 비교할 수 있습니다 – Nathan

+0

* "위나 아래로 스크롤하여 계속 스크롤하면 더 많은 항목을로드 할 수 있기를 원합니다 .. "* 시작할 때 모두로드하지 않는 이유는 무엇입니까? –

+0

@ Nathan : 예,하지만 사용자가 시도 할 때 어떻게 감지합니까? 더 많은 요소를로드하려면 위/아래로 스크롤하십시오. AndrewThompson : 한꺼번에로드 할 수는 없으며 네트워크를 통해 최대 10 억 개의 행이 될 수 있습니다. – BullyWiiPlaza

답변

3

스크롤 창의 JViewport에 변경 리스너를 사용하는 것이 좋습니다. 다음 예제에서는 진행 방법을 보여줍니다. 샘플을 실행합니다. shouldCheck가 시작시 세 번 인쇄되어 내 샘플 상단에 거짓 알림을 (방지하기 위해 사용 될 수 있습니다 및 해당 텍스트가 인쇄 된 상단과 하단에 슬라이더를 이동하십시오.

Screenshot with running sample

package com.thomaskuenneth; 

import javax.swing.*; 

public class Main { 

    static boolean shouldCheck = true; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      JFrame f = new JFrame("Demo"); 
      f.getContentPane().add(createUI()); 
      f.pack(); 
      f.setLocationRelativeTo(null); 
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
      f.setVisible(true); 
     }); 
    } 

    static JComponent createUI() { 
     String[][] rowData = new String[200][10]; 
     String[] columnNames = new String[10]; 
     for (int i = 0; i < 200; i++) { 
      for (int j = 0; j < 10; j++) { 
       if (i == 0) { 
        columnNames[j] = String.format("#%d", j); 
       } 
       rowData[i][j] = String.format("%d - %d", i, j); 
      } 
     } 
     JTable t = new JTable(rowData, columnNames); 
     JScrollPane sp = new JScrollPane(t); 
     JScrollBar sb = sp.getVerticalScrollBar(); 
     JViewport vp = sp.getViewport(); 
     vp.addChangeListener((l) -> { 
      if (!shouldCheck) { 
       return; 
      } 
      if (sb.getValue() == sb.getMinimum()) { 
       System.out.println("top"); 
      } else if (sb.getValue() + sb.getVisibleAmount() == sb.getMaximum()) { 
       System.out.println("bottom"); 
      } 
     }); 
     return sp; 
    } 
}