Java JScrollBar可见

Java JScrollBar可见,java,swing,Java,Swing,有没有办法知道JScrollBar是否在JPanel中可见 我的意思是,有时候,我的面板有很多矩形(把它想象成按钮),需要一个滚动条,有时候它不需要滚动条。我想知道是否可以知道它何时显示。如果您扩展JPanel并添加JScrollbars(水平和/或垂直),那么您可以控制它们何时必须可见或不可见 (您可以使用isvisible()函数检查它们当前是否可见) 您可以找到两个此类类的示例,它们根据其内容确定是否需要可见滚动条: (其回调将根据缩放因子调整可见性) (如果需要,其函数将调用JScro

有没有办法知道
JScrollBar
是否在
JPanel
中可见


我的意思是,有时候,我的面板有很多矩形(把它想象成按钮),需要一个滚动条,有时候它不需要滚动条。我想知道是否可以知道它何时显示。

如果您扩展
JPanel
并添加
JScrollbar
s(水平和/或垂直),那么您可以控制它们何时必须可见或不可见
(您可以使用
isvisible()
函数检查它们当前是否可见)

您可以找到两个此类类的示例,它们根据其内容确定是否需要可见滚动条:

  • (其回调将根据缩放因子调整可见性)
  • (如果需要,其函数将调用
    JScrollBar
    上的
    setVisible()

假设您有一个对
JScrollPane
的引用,您应该能够调用

yourJScrollPane.getHorizontalScrollBar().isVisible()


如果还需要获得有关可见性更改的通知,则可以使用以下代码:

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());
    }
  }
});

除了VonC和Joshua的回答之外,值得注意的是,
isVisible()
是超级类
组件上的一个方法。此外,各国:

确定当其父组件可见时,此组件是否应可见。 组件最初是可见的,但顶层组件(如框架对象)除外

这意味着,在将
JScrollPane
添加到大小框架之前,在
JScrollBar
上调用
isVisible()
将始终返回
true

考虑以下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;
}
publicstaticvoidmain(字符串[]args){
//在较大的滚动窗格中创建一个小表格
int size=5;
JTable table=新的JTable(makeData(大小)、makeheaders(大小));
JScrollPane=新的JScrollPane(表);
窗格.setPreferredSize(新维度(200200));
System.out.println(pane.getVerticalScrollBar().isVisible());//打印为true
JFrame=新JFrame(“JScrollPane测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(窗格);
System.out.println(pane.getVerticalScrollBar().isVisible());//打印为true
frame.pack();
System.out.println(pane.getVerticalScrollBar().isVisible());//打印错误
frame.setVisible(true);
System.out.println(pane.getVerticalScrollBar().isVisible());//打印错误
}
私有静态对象[]生成标题(整型大小){
对象[]标题=新对象[大小];

对于(inti=0;ib,通过将println包装为“if(isShowing())”,只有当滚动条在屏幕上实际可见时,才会通知您。
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;
}