簡體   English   中英

Java:JTree 和 BasicTreeUI 參考不顯示滾動條

[英]Java : JTree and BasicTreeUI reference doesn't show scrollbars

使用 JTreeWithScrollbar 示例,但將其顯着縮小以專注於該問題。

原始代碼將根據需要顯示垂直滾動條。

這里有足夠的空間,不需要滾動條。

在此處輸入圖像描述

如果面板移動得足夠多,就會出現滾動條。

在此處輸入圖像描述

一旦添加了以下代碼行,滾動條就會停止出現。

        tree.setUI(new MyTreeUI());

注意沒有滾動條。

在此處輸入圖像描述

如果上面這行代碼被注釋掉,就會出現垂直滾動條。

檢查 BasicTreeUI 的文檔,沒有任何與顯示/隱藏滾動條相關的內容。

2 個問題

1 - 使用 BasicTreeUI 對象時,需要什么來確保滾動條仍然起作用?

2 - 為什么即使注釋掉代碼行,水平滾動條也不會出現?

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.Dimension;

public class JTreeWithScrollbar extends JPanel { 
    private JEditorPane htmlPane;
    private JTree tree;

    public JTreeWithScrollbar() 
    {
        //Create the nodes. 
        DefaultMutableTreeNode top =  new DefaultMutableTreeNode("The Java Series");
        DefaultMutableTreeNode book1Node = new DefaultMutableTreeNode("Book 1");
        DefaultMutableTreeNode book2Node = new DefaultMutableTreeNode("Book 2");
        top.add(book1Node);
        top.add(book2Node);     

        tree = new JTree(top);
        tree.setUI(new MyTreeUI());  ///Comment out this line of code and the vertical scrollbar appears.

        JScrollPane treeView = new JScrollPane(tree);

        JScrollPane htmlView = new JScrollPane(htmlPane);

        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        splitPane.setTopComponent(treeView);
        splitPane.setBottomComponent(htmlView);

        Dimension minimumSize = new Dimension(100, 50);
        htmlView.setMinimumSize(minimumSize);
        splitPane.setDividerLocation(100); 
        splitPane.setPreferredSize(new Dimension(500, 300));
        add(splitPane);
    }
    
    public static void main(String[] args) 
    {
        //Create and set up the window.
        JFrame frame = new JFrame("TreeDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel jp = new JPanel();
        jp.add(new JTreeWithScrollbar());
        frame.add(jp);


        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
    
    
    private static class MyTreeUI extends BasicTreeUI 
    {
        public MyTreeUI() 
        {
            super();
        }

        @Override
        protected void updateCachedPreferredSize() {
            treeState.invalidateSizes();
            tree.treeDidChange();
        }
        
    }
}
  1. 在使用BasicTreeUI對象時,需要什么來確保滾動條仍然有效?

如下面的最小示例所示, BasicTreeUI在需要時正確顯示每個滾動條; 調整框架大小以查看效果。

  1. 為什么即使注釋掉了這行代碼,水平滾動條也永遠不會出現?

pack()之后,框架已調整大小以采用其內容的首選大小。 使框架稍小一點可以說明效果。 您的示例將樹添加到具有忽略首選大小的默認FlowLayoutJPanel 下面的示例將樹添加到框架的默認BorderLayout的中心,它響應首選尺寸。

  1. 我假設updateCachedPreferredSize()必須在幕后做其他事情......

確切地。 每次調用updateCachedPreferredSize()都會更新組件的首選大小以反映狀態的任何變化(調整大小、展開); 當首選大小超過視口大小時,會出現滾動條。 正如您所觀察到的,調用super.updateCachedPreferredSize()允許正常操作,並且任何進一步的自定義都必須保留該功能。

此外,

  • 這樣根據需要展開行。

  • 僅在事件調度線程上構造和操作 Swing GUI 對象。

  • 當你真的想覆蓋getPreferredSize()或說明調整大小的效果時,不要使用setSize() 更多在這里

樹

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.plaf.basic.BasicTreeUI;

public class JTreeWithScrollbar {

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            //Create and set up the window.
            JFrame frame = new JFrame("TreeDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JTree tree = new JTree(); //default model
            for (int i = 0; i < tree.getRowCount(); i++) {
                tree.expandRow(i);
            }
            tree.setUI(new MyTreeUI());
            frame.add(new JScrollPane(tree));

            //Display the window.
            frame.pack();
            frame.setSize(frame.getWidth() - 10, frame.getHeight() - 100);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

    private static class MyTreeUI extends BasicTreeUI {
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM