2009-08-10 80 views
3

有什麼方法可以知道JScrollBar是否可見或不在JPanel內?JScrollBar可見

我的意思是,有時候,我的面板有許多矩形(把它想成按鈕),需要一個滾動條,有時候它不需要它。我想知道我是否可以知道它何時顯示。

回答

3

如果延長JPanel,並添加自己的JScrollbar S(水平和/或垂直),然後就可以控制時,他們必須是有形或無形的
(你可以檢查它們是否當前與isvisible()功能可見)

你可以找到這樣的類,決定根據其內容需要滾動條可見兩個例子:

2

假設你有一個JScrollPane一個參考,你應該能夠只是調用

yourJScrollPane.getHorizontalScrollBar().isVisible() 

yourJScrollPane.getVerticalScrollBar().isVisible() 
+0

這對我有效!謝謝!! – KulaDamian 2017-12-13 06:05:08

2

如果您還需要得到有關可見性變化的通知可以使用代碼如下:

final JScrollPane scroll = new JScrollPane(createMyPanel()); 
scroll.getVerticalScrollBar().addHierarchyListener(new HierarchyListener() { 
    @Override 
    public void hierarchyChanged(HierarchyEvent e) { 
    if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED && 
     (e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) { 
     System.out.println(scroll.getVerticalScrollBar().isVisible()); 
    } 
    } 
}); 
+0

通過用「if(isShowing())」包裝println,只有當ScrollBar在屏幕上可見時纔會收到通知。 – bigleftie 2012-12-07 09:33:19

1

而且通過VonC和約書亞的答案,這是值得注意的是isVisible()是超類Component的方法。另外,javadoc指出:

確定此組件在其父項可見時是否應可見。 組件最初是可見的,但頂級組件(如框架對象)除外。

這意味着的是,直到JScrollPane添加到尺寸框架,呼籲JScrollBar總是返回trueisVisible()

考慮以下SSCCE:

public static void main(String[] args) { 
    // creates a small table in a larger scroll pane 
    int size = 5; 
    JTable table = new JTable(makeData(size), makeHeadings(size)); 
    JScrollPane pane = new JScrollPane(table); 
    pane.setPreferredSize(new Dimension(200, 200)); 
    System.out.println(pane.getVerticalScrollBar().isVisible()); // prints true 

    JFrame frame = new JFrame("JScrollPane Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(pane); 
    System.out.println(pane.getVerticalScrollBar().isVisible()); // prints true 

    frame.pack(); 
    System.out.println(pane.getVerticalScrollBar().isVisible()); // prints false 

    frame.setVisible(true); 
    System.out.println(pane.getVerticalScrollBar().isVisible()); // prints false 
} 

private static Object[] makeHeadings(int size) { 
    Object[] headings = new Object[size]; 
    for (int i=0; i<size; i++){ 
    headings[i] = i; 
    } 
    return headings; 
} 

private static Object[][] makeData(int size) { 
    Object[][] data = new Object[size][size]; 
    for (int i=0; i<size; i++){ 
    for (int j=0; j<size; j++){ 
     data[i][j] = i*j; 
    } 
    } 
    return data; 
} 

同樣,它的價值增加,如果您要添加的JScrollPane到一個內部框架,然後scrollBar.isVisible()只會一次內部框架已添加到另一個組件工作。