是否可以删除包含JTree的JScrollPane的默认首选大小?

时间:2016-05-11 21:35:19

标签: java swing jscrollpane jtree

当我将包含JTree的JScrollPane添加到带有GridBagLayout的JPanel时,它的行为就好像它有一个固定的大小。如果您运行以下代码示例,请注意内容面板有一个垂直滚动条,尽管JTree非常小。另请注意,即使我的代码没有设置它,spForTree.getPreferredSize()也会返回一个设置的大小(我不想设置大小)。

我的问题:当树很小时,有没有办法避免使用滚动条?我尝试了一些事情:

  1. 我尝试明确调用spForTree.setPreferredSize(null)来清除首选大小。这没有效果。对getPreferredSize()的后续调用仍会返回Dimension(123,363)

  2. 我尝试明确调用spForTree.setPreferredSize(new Dimension(100,100))来设置更小的尺寸。这有效,但我不想要固定大小。我需要删除首选大小,以便滚动窗格只使用可用空间。

  3. 我尝试扩展JScrollPane并覆盖getPreferredSize()方法,以便始终返回null。这导致java.awt.GridBagLayout.GetLayoutInfo(GridBagLayout.java:1118)中的NullPointerException

  4. 以下是演示此问题的示例代码:

    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的屏幕截图:

    Frame created by sample code

0 个答案:

没有答案