2009-08-10 3 views
3

JScrollBarが表示されているかいないJPanelを内かどうかを知るためのいくつかの方法がありますか?JScrollBarの目に見える

私は、いくつかの時間を意味し、私のパネルは、多くの長方形を持っている(ボタンと考える)と、それはそれを必要としないスクロールバーといくつかの時間を必要とします。私はそれがいつ表示されているかを知ることができるかどうかを知りたいです。

答えて

3

あなたがJPanelを拡張し、自分で(水平および/または垂直)JScrollbar Sを追加する場合は、あなたは、彼らがしなければならないときに制御することができ、可視又は不可視の
(彼らはisvisible()機能と、現在表示されているかどうかをチェックすることができます)

あなたはその内容に応じて、可視スクロールバーの必要性を決定し、このようなクラスの2つのサンプルを見つけることができる:

2

あなたはJScrollPaneへの参照を持っていると仮定すると、あなただけの

yourJScrollPane.getHorizontalScrollBar().isVisible() 

または

を呼び出すことができるはずです
yourJScrollPane.getVerticalScrollBar().isVisible() 
+0

これは私のために働いた!ありがとう!! – KulaDamian

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をラップすると、スクロールバーが実際に画面に表示されたときにのみ通知されます。 – bigleftie

1

をさらにVonCとジョシュアによって答えに、それはisVisible()は、スーパークラスComponent上の方法であることは注目に値します。また、javadocの状態は次のとおりです。

親が表示されているときにこのコンポーネントを表示するかどうかを決定します。 フレームオブジェクトなどのトップレベルのコンポーネントを除いて、コンポーネントが最初に表示されます。これが何を意味するのか

ですJScrollPaneJScrollBar意志常にリターン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()のみが動作することを追加する価値があります。

関連する問題