【问题标题】:JTree doesn't show up, no matter which layout I use无论我使用哪种布局,JTree 都不会出现
【发布时间】:2013-10-27 23:34:43
【问题描述】:

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

【问题讨论】:

  • 粗体是为了强调。请不要将帖子的每个字加粗。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • setSize(100, 300); Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或 combinations of them,以及 white space 的布局填充和边框。设置大小可能(可能)是导致此问题的原因。

标签: java swing layout-manager jtree


【解决方案1】:

您的类 Tree 扩展了 JComponent。

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

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

编辑:

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

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

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

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

【讨论】:

  • Camickr,你的建议奏效了——但它只在我执行“this.add(tree);”而不是“this.add(scrollPane);”时才有效。
【解决方案2】:

这几乎是 camickr 所指出的,但将代码作为 SSCCE 并进行了一些其他调整。为了简单起见,我将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);
    }
}

【讨论】:

    【解决方案3】:

    再看一下 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);
    

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2017-03-30
      • 1970-01-01
      • 2020-09-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多