私は呼び出すことにより、グラフィックスを更新することができますので、私自身JTree
モデルを作成しようとしました:updateUI();
私JTree
がでツリーを表示しなければならないときに私が問題に遭遇しました2枝以上の深さ。のJavaのSwing - JTreeの - てsetModelグラフィックバグより、その後2本のチェーン枝に
java.util.Vector
という拡張された独自のクラスを使用します(NamedVector
)。ここで
は、ツリーはのようになります方法は次のとおりです。
ROOT
Branch
BranchInside
Leaf
Leaf
...
OtherBranch
AndOneMore
...
...
そして、ここではそれがどのように見えるかです:
jTree1.setModel(new javax.swing.tree.TreeModel(){
@Override
public Object getRoot(){
return core.Project.sharedInstance.getTranslationsTree();
}
@Override
public Object getChild(Object parent, int index){
if(parent instanceof String) return null;
return ((core.NamedVector)parent).get(index);
}
@Override
public int getChildCount(Object parent){
if(parent instanceof String) return 0;
return ((core.NamedVector)parent).size();
}
@Override
public boolean isLeaf(Object node){
if(node instanceof String) return true;
return ((core.NamedVector)node).isEmpty();
}
@Override
public int getIndexOfChild(Object parent, Object child){
if(parent instanceof String) return -1;
return ((core.NamedVector)parent).indexOf(child);
}
@Override
public void valueForPathChanged(TreePath path, Object newValue){}
@Override
public void addTreeModelListener(TreeModelListener l){}
@Override
public void removeTreeModelListener(TreeModelListener l){}
});
:
http://imageshack.us/photo/my-images/39/fehlerqq.png/
はここで私は新しいのTreeModelを設定する方法を説明します
(core.Project.sharedInstance.getTranslationsTree()
返品。
public class NamedVector extends java.util.Vector{
public String name;
public NamedVector(String name){
this.name = name;
}
@Override
public String toString(){
return name;
}
public static void dirToVector(java.io.File sourceLocation, NamedVector target){
if(sourceLocation.isDirectory()){
String[] children = sourceLocation.list();
for(int i=0; i<children.length; i++){
NamedVector vector = new NamedVector(children[i]);
target.add(vector);
dirToVector(new java.io.File(sourceLocation, children[i]),
vector);
}
}
}
public void print(){
print("");
}
private void print(String pre){
System.out.println(pre+name);
pre+=" ";
for(int i=0;i<this.size();i++){
if(get(i) instanceof NamedVector){
((NamedVector)get(i)).print(pre);
}else{
System.out.println(pre+get(i).toString());
}
}
}}
私が上で自分のモデルを使用する場合にのみ発生します。ここでは、ルートの私の木のベクトル、私はコンソールでそれを印刷するとき、それは正しい結果が得られる)
そして、私のNamedVector
クラスです私がDefaultMutableTreeNode
でビルドすると、それはすべて正しいものを表示しますが、私はカスタムモデルを使いたいと思います。
のための空の実装を持っている場合は、[SSCCE](http://sscce.org/)を投稿してください。 * "自分のJTreeモデルを作成しようとしました" *なぜですか?この宿題ですか?もしそうなら、そのようにマークしてください。そうでない場合は、分かりやすいものを行い、['DefaultTreeModel'](http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultTreeModel .html)。 –
GUIのルックアンドフィールを扱っていない場合、Swingコンポーネントで 'udateUI'を呼び出す理由はありません。 –
@Andrewしかし、DefaultTreeModelのために私は私のベクトルを変更するときに自分のノードを手動で追加しなければなりません。私のベクトルを変更してupdateUI()メソッドを呼び出すだけで私のツリーは自分自身でビルドされるようにします:( – Bananni