有没有办法知道JScrollBar
内JPanel
是否可见?
我的意思是,有时候,我的面板有很多矩形(把它想象成按钮)并且需要一个滚动条,有时它不需要它。我想知道我是否能知道它何时被展示。
答案 0 :(得分:3)
如果您延长JPanel
并添加JScrollbar
s(水平和/或垂直),那么您可以控制它们何时必须可见或不可见
(您可以使用isvisible()
功能检查它们当前是否可见)
您可以找到两个此类类的示例,这些类根据内容确定是否需要可见滚动条:
JGraphPanel
(其回调actionPerformed(Event e)
将根据缩放系数调整可见性)Plane
(如果需要,其功能adjustComponents()
会在setVisible()
上致电JScrollBar
答案 1 :(得分:2)
假设您有JScrollPane
的引用,您应该可以致电
yourJScrollPane.getHorizontalScrollBar().isVisible()
或
yourJScrollPane.getVerticalScrollBar().isVisible()
答案 2 :(得分: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());
}
}
});
答案 3 :(得分:1)
除了VonC和Joshua的答案之外,值得注意的是isVisible()
是超类Component
上的一种方法。此外,javadoc州:
确定当其父组件可见时此组件是否应该可见。 组件最初是可见的,但顶级组件除外,例如Frame对象。
这意味着,在将JScrollPane
添加到大小的框架之前,在isVisible()
上调用JScrollBar
将始终返回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;
}
同样,值得补充的是,如果您要将JScrollPane
添加到内部框架,那么scrollBar.isVisible()
仅在内部框架添加到另一个组件后才会起作用。