JScrollPane如何理解何时需要显示滚动条?

时间:2015-08-10 16:26:30

标签: java swing jscrollpane

我们有一个组件Component mainComp,它将位于scrollPane中;

scrollPane.add(mainComp);

在某些时候,这样的东西被称为

mainComp.setPreferredSize(null);
Component parent = jframe1.getParent();
while (parent != null){
  parent.setPreferredSize(null);
  parent = parent.getParent();
}

此后滚动条消失,只有当我通过鼠标调整JFrame时才会再次出现。

我不明白如何让JScrollPane强制重新计算它是否需要显示滚动条。有可能吗?

2 个答案:

答案 0 :(得分:2)

  

在某些时候,这样的东西被称为

mainComp.setPreferredSize(null);
Component parent = jframe1.getParent();
while (parent != null){
  parent.setPreferredSize(null);
  parent = parent.getParent();
}
after this the scrolling bars gets disappeared and appear again only if I resize JFrame via mouse.

So I can't understand how to make JScrollPane force to recalculate \ rethink that it needs to show the scrolling bars?

JScrollPane查看其JViewPort所持有的组件的大小,如果大于JViewPort的大小,则会显示滚动条。当你使JScrollPane保持的组件的首选大小为null时,那就是它的大小混乱(在领主知道用什么方式,我从未见过这样的代码是诚实的),并且你松开滚动条。我想到的解决办法就是不要拨打setPreferredSize(null)。永远。必须有更好的方法来实现您尝试做的事情,如果您告诉我们更多关于您的代码和问题的信息,我们很可能会帮助您找到这个。我不得不怀疑你的问题实际上是伪装成XY Problem

答案 1 :(得分:2)

您可以强制JScrollPane始终使用setHorizontalScrollBarPolicysetVerticalScrollBarPolicy显示滚动条:

scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

请参阅:Setting the Scroll Bar Policy

  

启动时,ScrollDemo应用程序中的滚动窗格有两个滚动条。如果使窗口变大,则两个滚动条都会消失,因为它们不再需要。如果然后缩小窗口的高度而不更改其宽度,则会再次出现垂直滚动条。进一步的实验将表明,在这个应用程序中,两个滚动条都会消失并根据需要重新出现。此行为由滚动窗格的滚动条策略控制,实际上,它是两个策略:每个滚动条都有自己的。

注意:虽然此回答了您提出的问题,但请参阅@HovercraftFullOfEels answer about why you should never use setPreferredSize(null) EVER.