2012-10-16 75 views
5

我想知道是否有一種方法可以知道JScrollBar(我的情況是垂直的)何時到達其包含JScrollPane的底部。我不知道如何解釋JScrollBarvalue屬性。此外,我不確定要正確理解maximum代表什麼,以及如果我可以使用該值來獲取我需要的信息。如何知道JScrollBar是否已經到達JScrollPane的底部?

編輯

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
    @Override 
    public void adjustmentValueChanged(AdjustmentEvent ae) { 
     System.out.println("Value: " + scrollPane.getVerticalScrollBar().getValue() + " Max: " + scrollPane.getVerticalScrollBar().getMaximum()); 
    } 
} 
+1

你想實現什麼? – kleopatra

+0

@kleopatra在滾動條到達窗格底部時執行一些操作。 – nathan

+1

做什麼事情?當有人問這樣的問題時,請更具體一些。 –

回答

9

你必須滾動條的範圍內添加到您的計算。我在下面的例子中將代碼添加到代碼中。

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
    @Override 
    public void adjustmentValueChanged(AdjustmentEvent ae) { 
     int extent = scrollPane.getVerticalScrollBar().getModel().getExtent(); 
     System.out.println("Value: " + (scrollPane.getVerticalScrollBar().getValue()+extent) + " Max: " + scrollPane.getVerticalScrollBar().getMaximum()); 
    } 
} 

兩個替換實現(部分反應以克列奧帕特拉)

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 

    @Override 
    public void adjustmentValueChanged(AdjustmentEvent event) { 
     JScrollBar scrollBar = (JScrollBar) event.getAdjustable(); 
     int extent = scrollBar.getModel().getExtent(); 
     System.out.println("1. Value: " + (scrollBar.getValue() + extent) + " Max: " + scrollBar.getMaximum()); 

    } 
}); 

,或者通過模型

scrollPane.getVerticalScrollBar().getModel().addChangeListener(new ChangeListener() { 

    @Override 
    public void stateChanged(ChangeEvent event) { 
     BoundedRangeModel model = (BoundedRangeModel) event.getSource(); 
     int extent = model.getExtent(); 
     int maximum = model.getMaximum(); 
     int value = model.getValue(); 

     System.out.println("2. Value: " + (value + extent) + " Max: " + maximum); 

    } 
}); 
+0

基本上正確:-) Nitpicking訪問scrollPane並深入潛入其領域當你可以通過查詢事件來實現... – kleopatra

+0

@kleopatra我同意,我只是試圖與nathan使用的編碼風格保持一致。 – JeroenWarmerdam

+0

@kleopatra你能否提供你的答案? :) – nathan

-1
scrollBar.getValue()==scrollBar.getMaximum() 
+1

哼。我已經嘗試在調整事件觸發時顯示* value *屬性的值,並且它永遠不會達到最大值。所以我認爲你的狀況永遠不會被證實。 – nathan

+0

編輯我的問題。 – nathan

+1

通過使用此代碼行[不需要實現AdjustmentListener](http://stackoverflow.com/a/12707995/714968) – mKorbel

1

通過使用JScrollPane的視口,如果視口是可以計算出查看組件的結尾。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class ViewPortDemo extends JPanel{ 

    public ViewPortDemo(){ 
     super(); 
     JTree tree = new JTree(); 
     for(int i =0; i < tree.getRowCount(); i++){ 
      tree.expandRow(i); 
     } 

     final JScrollPane pane = new JScrollPane(tree){ 
      Dimension prefSize = new Dimension(200,150); 
      public Dimension getPreferredSize(){ 
       return prefSize; 
      } 
     }; 

     pane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       JViewport vp = pane.getViewport(); 
       if(vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y){ 
        System.out.println("End"); 
       } 
      } 
     }); 

     add(pane); 
    } 


    public static void main(String[] args){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ViewPortDemo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

不需要計算大小的東西 - 可調整的所有信息需要;-) – kleopatra

3

@StanislavL幾乎得到了正確的答案。

嘗試scrollBar.getValue() == scrollBar.getMaximum() - scrollBar.getVisibleAmount()

爲了理解爲什麼getVisibleAmount()調用是必要的,您必須先了解JScrollBars的工作方式。 JScrollBar有4個值:最小值,最大值,值和範圍。 value是滾動手柄本身的頂部,而extent是滾動手柄的有效長度。 value永遠不會等於maximum,除非滾動手柄的長度爲0.爲了進行補償,我們必須通過減去滾動手柄的長度以獲得有效最大值來調整我們正在比較的值。

這種效應被記錄here,這誤導性使得它聽起來像getMaximum()調整像它應該的價值,但在implementation of JScrollBar密切關注表明,getMaximum()實際上給了我們真正的最大值,而不是有效的最大值。

+1

這絕妙的單行應該肯定是答案!一個簡單的答案沒有視口等,感謝了近兩年後的很多! – geisterfurz007

相關問題