2017-01-10 16 views
0

私はJavaのスイングのJTreeを使用しており、そのパス内の選択したノードの適切な行インデックスを見つける必要があります。例えば、私は下の写真でPolygon 2JTreeノードの正しい行位置を取得する

enter image description here

を選択-and正しい値2を得る-I、

tree.getRowForPath(/*path of polygon node*/); 

のコードのこの部分を使用します。ただし、Polygon 3を選択すると、値は6になります。これは、適切なノードを見つけるときに、Polygon 2がカウントに展開されるノードを取るためです。 Polygon 3が選択されたときに値3を返す必要があるので、これは望ましくありません。以前のノードまたはノードが展開されているかどうかにかかわらず、私は値3を返す必要があります。

私はすべてのノードをループして、選択したノードの行インデックスの前にあるノードを見つけ出し、ノードが展開されているかどうかを確認し、ノードの数を数えます。次に、それを上記のメソッドから返された行に追加します。

問題はどのようにこれにアプローチするのか分かりません。私はスパゲッティのコードを試してみましたが、それは役に立つとは思っていません。

何か助けていただければ幸いです。

+0

私は質問がなぜでしょうか?あなたは結果として「3」を必要とすることを達成しようとしていますか?物事の音から、問題なくノードを得ることができます。なぜ行の値が必要ですか? 'DefaultMutableTreeNode'のようなものを使用している場合は、目的を達成するのに役立つ追加情報を含むことができる' userObject'を提供することができます – MadProgrammer

+0

@MadProgrammerこのJTreeは、ユーザがポリゴンを追加または削除すると変化するノードを持ちます。私はポリゴンを含む別のArrayListを持っており、それに基づいて、何かが変更された場合、このJTreeはそのリストを更新します。 JTreeでポリゴンを選択する場合は、ArrayListに接続できるように行を知り、そのポリゴンに変更したいものを変更する必要があります。私は 'DefaultMutableTreeNode'を拡張するのではなく、それを計算したアルゴリズムを持っている方が簡単だと思います。私は間違っている可能性がある。 – Eric

+0

私の好みの解決策は、 'DefaultMutableTreeNode'を' Polygon'で管理するか、それが更新できるモデルへの参照を持っていることですが、それは私です:P ...基本的には、 'JTree'とあなたの既存モデルの間にある結束の量を最小限に抑えたいと思っています – MadProgrammer

答えて

1

@ MadProgrammerの提案に基づいた解決策を彼のコメントに書いてしまった。

public class CustomTreeNode extends DefaultMutableTreeNode { 

    private int position; 

    public CustomTreeNode(String text, int position){ 
     super(text); 
     this.position = position; 
    } 

    public int getPosition(){ 
     return this.position; 
    } 

} 

これは関係なく、名前の(@Sergiy Medvynskyyさんも役立つソリューションを参照)、私は私が好きなオブジェクトのインデックスを保持することができますので、同様に、私は、ツリーノードクラスを作成しました。

が、私はそうのようなオブジェクトを初期化し(これはループの中にあった):私は簡単に取り込むことができるよどの

@Override 
public void valueChanged(TreeSelectionEvent e) { 

    TreePath[] selectedPaths = tree.getSelectionPaths(); 
    TreePath parentPath = tree.getClosestPathForLocation(1, 1); 

    if (selectedPaths == null) 
     return; 

    ArrayList<Integer> validRows = new ArrayList<>(); 

    for (TreePath tp : selectedPaths){ 

     if (tp.getParentPath() != parentPath) 
      continue; 

     //get node that current selected path points too, then get the custom index of that 
     CustomTreeNode selectedNode = (CustomTreeNode) tp.getLastPathComponent(); 

     System.out.println(selectedNode.getPosition()); 

     validRows.add(selectedNode.getPosition()); 

} 

お知らせ:

//root node 
CustomTreeNode polygon = new CustomTreeNode("Polygon " + (i+1), i); 

は、私はこのようなノードを使用しましたArrayList validRowすべてのノードを反復処理せずに、展開したノードを削除します。

1

ここにその例があります(私があなたの質問を正しく理解している場合)。しかし、@MadProgrammerの解決策が好ましい方法です。

public static int indexInParentForPath(JTree aTree, TreePath path) { 
    Object p = null; 
    Object parent = null; 
    for (int i = 0; i < path.getPathCount(); i++) { 
     if (path.getPathComponent(i).toString().contains("Polygon")) { 
      p = path.getPathComponent(i); 
      parent = i > 0 ? path.getPathComponent(i - 1) : null; 
      break; 
     } 
    } 
    if (p != null) { 
     return parent == null ? 0 : aTree.getModel().getIndexOfChild(parent, p); 
    } 
    return -1; 
} 
関連する問題