0

我创建了 JTree 及其所有组件,然后在另一个类中将其添加到 JPanel。之后,我将 JPanel 添加到 JFrame;是的,我确保所有内容都设置为可见,面板在 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();
    }
}
4

3 回答 3

3

您的类 Tree 扩展了 JComponent。

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

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

编辑:

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

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

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

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

于 2013-10-27T23:48:21.287 回答
2

这几乎是 camickr 所注意到的,但将代码作为 SSCCE 和一些其他调整。为了简单起见,我将 a 换成了JComponenta 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);
    }
}
于 2013-10-27T23:55:29.397 回答
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);
}

您的“树”组件包含 JScrollPane 和 JTree。在您的构造函数中,您尝试实例化这两个对象,然后将您的 JTree 添加到您的 JScrollPane。

在您当前的代码中,您做得很差。JScrollPane(Component)根据文档,您拨打电话:

创建一个显示指定组件内容的 JScrollPane,只要组件的内容大于视图,就会出现水平和垂直滚动条。

然后,您尝试将树再次添加到 JScrollPane 中,一旦它已被设置为视图,然后再次将视图重置为您的自定义“树”组件,该组件没有实现任何绘画逻辑。

尝试删除调用,JSrollPane.add(Component)并且JScrollPane.setViewportView(Component)当您将此组件添加到“面板”时,添加包含的 JScrollPane 如下所示:

add(new Tree().scrollPane, BorderLayout.WEST);
于 2013-10-27T23:57:01.143 回答