2017-05-23 20 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で変更リスナーを使用することをおすすめします。次の例は、続行する方法を示しています。私のサンプルトップに起動時に3回印刷される(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; 
    } 
} 
関連する問題