我创建了JTree及其所有组件,然后在另一个类中我将它添加到JPanel。之后,我将JPanel添加到JFrame;是的,我已经确保所有内容都设置为可见,Panel会在setVisible()等之前添加到框架中。
那为什么我的滚动窗格不会出现在JTree上?
package TreeExample;
import java.awt.Color;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class Tree extends JComponent
{
JTree tree;
JScrollPane scrollPane;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("RootNode");
public Tree()
{
setVisible(true);
setSize(100, 300);
createChildNodes(root);
tree = new JTree(root);
tree.setVisible(true);
tree.setSize(100, 300);
scrollPane = new JScrollPane(tree);
scrollPane.add(tree);
scrollPane.setVisible(true);
scrollPane.setSize(100, 300);
scrollPane.setViewportView(this);
scrollPane.setBackground(Color.red);
}
private void createChildNodes(DefaultMutableTreeNode rootNode)
{
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child 1");
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child 2");
DefaultMutableTreeNode child3 = new DefaultMutableTreeNode("Child 3");
rootNode.add(child1);
rootNode.add(child2);
rootNode.add(child3);
DefaultMutableTreeNode grandchild1 = new DefaultMutableTreeNode(
"Grandchild 1");
DefaultMutableTreeNode grandchild2 = new DefaultMutableTreeNode(
"Grandchild 2");
child1.add(grandchild1);
child1.add(grandchild2);
}
}
这是我的小组......
package TreeExample;
import java.awt.BorderLayout;
import java.awt.TextArea;
import javax.swing.JPanel;
public class Panel extends JPanel
{
Panel()
{
setLayout(new BorderLayout());
add(new Toolbar(), BorderLayout.NORTH);
add(new TextArea(), BorderLayout.CENTER);
add(new Tree(), BorderLayout.WEST);
}
}
这是我的框架。
package TreeExample;
import javax.swing.JFrame;
public class Frame extends JFrame
{
Frame()
{
setTitle("ToolBar Example");
add(new Panel());
pack();
setVisible(true);
setSize(500, 500);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new Frame();
}
}
答案 0 :(得分:3)
您的类Tree扩展了JComponent。
您在类中创建了一个JTree和JScrollPane,但是您没有将滚动窗格添加到组件中,因此您的Tree组件为空。
您需要为Tree类设置布局管理器,为其添加一些组件。
编辑:
scrollPane = new JScrollPane(tree);
//scrollPane.add(tree);
上面的代码错了。首先,创建一个以树为参数的滚动窗格。这是正确的,因为树被添加到滚动窗格的视口中。
但是,然后将树直接添加到滚动窗格,这是错误的,因为组件只能有一个父窗口,因此树会从滚动窗格中删除。
如图所示注释掉该行,然后您应该可以使用this.add(scrollpane);
答案 1 :(得分:2)
这就是camickr什么都不是,但代码作为SSCE和其他一些调整。为简单起见,我将JComponent
替换为JPanel
。
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
public class Frame extends JFrame
{
Frame()
{
setTitle("ToolBar Example");
add(new Panel());
//setSize(500, 500);
setLocationByPlatform(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack(); //should be next to last!
setVisible(true); //should be last!
}
public static void main(String[] args)
{
new Frame();
}
}
class Tree extends JPanel
{
JTree tree;
JScrollPane scrollPane;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("RootNode");
public Tree()
{
//setVisible(true);
//setSize(100, 300);
createChildNodes(root);
tree = new JTree(root);
tree.setVisibleRowCount(5);
//tree.setVisible(true);
//tree.setSize(100, 300);
scrollPane = new JScrollPane(tree);
//scrollPane.add(tree);
//scrollPane.setVisible(true);
//scrollPane.setSize(100, 300);
//scrollPane.setViewportView(this);
scrollPane.setBackground(Color.red);
add(scrollPane);
}
private void createChildNodes(DefaultMutableTreeNode rootNode)
{
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child 1");
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child 2");
DefaultMutableTreeNode child3 = new DefaultMutableTreeNode("Child 3");
rootNode.add(child1);
rootNode.add(child2);
rootNode.add(child3);
DefaultMutableTreeNode grandchild1 = new DefaultMutableTreeNode(
"Grandchild 1");
DefaultMutableTreeNode grandchild2 = new DefaultMutableTreeNode(
"Grandchild 2");
child1.add(grandchild1);
child1.add(grandchild2);
}
}
class Panel extends JPanel
{
Panel()
{
setLayout(new BorderLayout());
// add(new Toolbar(), BorderLayout.NORTH);
// Don't mix Swing & AWT without good cause..
add(new JTextArea(5,20), BorderLayout.CENTER);
add(new Tree(), BorderLayout.WEST);
}
}
答案 2 :(得分:1)
再看一下Tree的默认构造函数:
JTree tree;
JScrollPane scrollPane;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("RootNode");
public Tree()
{
setVisible(true);
setSize(100, 300);
createChildNodes(root);
tree = new JTree(root);
tree.setVisible(true);
tree.setSize(100, 300);
scrollPane = new JScrollPane(tree);
scrollPane.add(tree);
scrollPane.setVisible(true);
scrollPane.setSize(100, 300);
scrollPane.setViewportView(this);
scrollPane.setBackground(Color.red);
}
您的“Tree”组件包含JScrollPane和JTree。在构造函数中,您尝试实例化两个对象,然后将JTree添加到JScrollPane。
在您当前的代码中,您做得很差。根据文档:
,您可以拨打JScrollPane(Component)
创建一个显示指定内容的JScrollPane 组件,其中出现水平和垂直滚动条 只要组件的内容大于视图。
然后,一旦将树设置为视图,然后再将重新添加到自定义“树”组件,则尝试再次将树添加到JScrollPane 没有实现任何绘画逻辑。
尝试删除对JSrollPane.add(Component)
和JScrollPane.setViewportView(Component)
的调用,当您将此组件添加到“面板”时,添加包含的JScrollPane 而不是,如下所示:
add(new Tree().scrollPane, BorderLayout.WEST);