[英]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();
}
}
}
- 在使用
BasicTreeUI
對象時,需要什么來確保滾動條仍然有效?
如下面的最小示例所示, BasicTreeUI
在需要時正確顯示每個滾動條; 調整框架大小以查看效果。
- 為什么即使注釋掉了這行代碼,水平滾動條也永遠不會出現?
在pack()
之后,框架已調整大小以采用其內容的首選大小。 使框架稍小一點可以說明效果。 您的示例將樹添加到具有忽略首選大小的默認FlowLayout
的JPanel
; 下面的示例將樹添加到框架的默認BorderLayout
的中心,它響應首選尺寸。
- 我假設
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.