4

私はいくつかのうなずきで埋められた古典的なJTreeを持っています。ツリーが次のようになっていると仮定しましょう。

Root
|-Fruit
|--Apple
|--Orange
|-Objects
|--Table
|--Car

次のような想定パスを使用してノードが存在するかどうかをJavaで確認する方法はありますか?

TreeNode found = model.getNodeOrNull("\\Fruit\\Apple")

したがって、指定された場所にノードが存在する場合はそれが返され、そうでない場合はnullが返されますか?Javaにそのようなメカニズムはありますか?

4

3 に答える 3

5

あなたはこれらの線に沿って何かを実験するかもしれません。

ツリーノードの場所

出力例

food:pizza found true
od:pizza found false
sports:hockey found true
sports:hockey2 found false

TreeNodeLocation.java

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.Position;
import javax.swing.tree.TreePath;

public class TreeNodeLocation {

    private JTree tree = new JTree();

    TreeNodeLocation() {
        JPanel p = new JPanel(new BorderLayout(2,2));

        final JTextField find = new JTextField("food:pizza");
        find.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                boolean found = findText(find.getText());
                System.out.println(find.getText() + " found " + found);
            }
        });
        p.add(find, BorderLayout.PAGE_START);

        tree.setVisibleRowCount(8);
        for (int row=tree.getRowCount(); row>=0; row--) {
            tree.expandRow(row);
        }

        p.add(new JScrollPane(tree),BorderLayout.CENTER);

        JOptionPane.showMessageDialog(null, p);
    }

    public boolean findText(String nodes) {
        String[] parts = nodes.split(":");
        TreePath path = null;
        for (String part : parts) {
            int row = (path==null ? 0 : tree.getRowForPath(path));
            path = tree.getNextMatch(part, row, Position.Bias.Forward);
            if (path==null) {
                return false;
            }
        }
        tree.scrollPathToVisible(path);
        tree.setSelectionPath(path);

        return path!=null;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TreeNodeLocation();
            }
        });
    }
}
于 2012-06-05T04:50:13.847 に答える
2

ここに示すように、モデルのEnumerationインスタンスの1つを使用して検索できます。

于 2012-06-04T16:50:18.160 に答える
2

残念ながら、それを行う箱から出して何もありません。これにより、Swingが設計に課したくないノードについていくつかの仮定が立てられます。これは、ツリー内のノードであることが何を意味するかを制約するためです(つまり、すべてのノードには、ノードを一意に識別する何らかの文字列があります)。だからといって、自分で簡単に実装できないわけではありません。TreePathはJTreeの一般的な考え方であることに気付いているかもしれません。そのため、パスを指定してTreePathをノードに返す簡単なメソッドを次に示します。

http://www.exampledepot.8waytrips.com/egs/javax.swing.tree/FindNode.html

あなたはそれをあなたが求めているものを実行するための基礎として使うことができます。

于 2012-06-04T17:00:05.600 に答える