当我将包含JTree的JScrollPane添加到带有GridBagLayout的JPanel时,它的行为就好像它有一个固定的大小。如果您运行以下代码示例,请注意内容面板有一个垂直滚动条,尽管JTree非常小。另请注意,即使我的代码没有设置它,spForTree.getPreferredSize()
也会返回一个设置的大小(我不想设置大小)。
我的问题:当树很小时,有没有办法避免使用滚动条?我尝试了一些事情:
我尝试明确调用spForTree.setPreferredSize(null)
来清除首选大小。这没有效果。对getPreferredSize()
的后续调用仍会返回Dimension(123,363)
。
我尝试明确调用spForTree.setPreferredSize(new Dimension(100,100))
来设置更小的尺寸。这有效,但我不想要固定大小。我需要删除首选大小,以便滚动窗格只使用可用空间。
我尝试扩展JScrollPane
并覆盖getPreferredSize()
方法,以便始终返回null
。这导致java.awt.GridBagLayout.GetLayoutInfo(GridBagLayout.java:1118)中的NullPointerException
以下是演示此问题的示例代码:
package tree.test;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
public class TreeTEST {
public TreeTEST() {
super();
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(500,300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
JPanel m_contentPanel = new JPanel();
JScrollPane spForContent = new JScrollPane(m_contentPanel);
spForContent.setBorder(null);
m_contentPanel.setLayout(new GridBagLayout());
frame.add(spForContent) ;
JTree tree = new JTree();
JScrollPane spForTree = new JScrollPane(tree);
boolean ispref = spForTree.isPreferredSizeSet();
Dimension dim1 = spForTree.getPreferredSize();
System.out.println("isPreferredSizeSet = " +ispref +" dim y = " +dim1.height);
m_contentPanel.add(spForTree, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST,
GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
frame.pack();
}
public static void main(String[] args) {
TreeTEST ttest = new TreeTEST();
}
}
以下是示例代码创建的Frame的屏幕截图: