Java和JScrollPane:在哪里调用setPreferredSize?

时间:2011-01-13 14:13:07

标签: java swing jscrollpane

我正在使用JScrollPane而在viewportView.doLayout内,我正在呼叫viewportView.setPreferredSize。这似乎是错误的,因为JScrollPane的滚动条总是根据setPreferredSize之前的doLayout更新。因此,如果是重新验证,JScrollPane首先会根据首选大小更新滚动条,然后调用doLayout

我可以改变这种行为吗?或者我应该在哪里拨打setPreferredSize?或者我应该在哪里放置布局子组件的代码?


我想出了一种有效的方法:

this.setPreferredSize内拨打this.setSizeviewportView.doLayout

我保持这个问题是开放的,因为我不明白为什么会这样做(如果我删除其中一个就不行)并且想知道。


好吧,这很有效,因为它产生了无限循环,即它总是将一些重新验证请求推送到事件循环中,当然这解决了问题。但是,这不是一个真正的解决方案。

我现在有了这个:

// In viewportView of the JScrollPane:
@Override public void doLayout() {
    // ... layout childs ...
    // size.x/size.y being the size I want to have for the viewportView
    if(size.x != getPreferredSize().width || size.y != getPreferredSize().height) {
        setPreferredSize(new Dimension(size.x, size.y));
        if(getParent() != null) getParent().validate();
    }
}

现在似乎工作正常。

仍然想知道是否有人可以澄清这是否是正确的方式,如果没有,那会是什么。

1 个答案:

答案 0 :(得分:0)

如果您希望JScrollPane的内容(例如JPanel)尺寸将其设置为内容。如果您希望JScrollPane的大小设置为JScrollPane。无需调用viewPortView的方法。