无论我使用哪种布局,JTree都不会显示出来

时间:2013-10-27 23:34:44

标签: java swing layout-manager jtree

我创建了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();
    }
}

3 个答案:

答案 0 :(得分:3)

您的类Tree扩展了JComponent。

您在类中创建了一个JTree和JScrollPane,但是您没有将滚动窗格添加到组件中,因此您的Tree组件为空。

您需要为Tree类设置布局管理器,为其添加一些组件。

编辑:

scrollPane = new JScrollPane(tree);
//scrollPane.add(tree);

上面的代码错了。首先,创建一个以树为参数的滚动窗格。这是正确的,因为树被添加到滚动窗格的视口中。

但是,然后将树直接添加到滚动窗格,这是错误的,因为组件只能有一个父窗口,因此树会从滚动窗格中删除。

如图所示注释掉该行,然后您应该可以使用this.add(scrollpane);

答案 1 :(得分:2)

这就是camickr什么都不是,但代码作为SSCE和其他一些调整。为简单起见,我将JComponent替换为JPanel

enter image description here

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);