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

上記のコードは間違っています。最初に、ツリーをパラメータとしてスクロール区画を作成します。スクロールペインのビューポートにツリーが追加されるので、これは正しいです。

ただし、ツリーをスクロールペインに直接追加すると、コンポーネントは親を 1 つしか持てないため、ツリーがスクロールペインから削除されるため、間違っています。

示されているように行をコメントアウトすると、 this.add(scrollpane); を使用できるようになります。

于 2013-10-27T23:48:21.287 に答える
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)andの呼び出しを削除してみてくださいJScrollPane.setViewportView(Component)。このコンポーネントを「パネル」に追加するときは、次のように、含まれている JScrollPaneを代わりに追加してください。

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