2010-06-18 5 views
0

버튼을 클릭 할 때와 같이 만들고 싶으면 새 파일을 만듭니다. 그런 다음 jTree가 새 파일을 강조 표시합니다. 아래는 내 코드입니다. 현재 새 파일을 만들고 새 파일을 표시하지만 파일을 강조 표시하지 않습니다.JTree에서 새로 만든 파일을 강조 표시하는 방법

class FileTreeModel implements TreeModel { 
private FileNode root; 

public FileTreeModel(String directory) { 
    root = new FileNode(directory); 
} 

public Object getRoot() { 
    return root; 
} 

public Object getChild(Object parent, int index) { 
    FileNode parentNode = (FileNode) parent; 
    return new FileNode(parentNode, parentNode.listFiles()[index].getName()); 
} 

public int getChildCount(Object parent) { 
    FileNode parentNode = (FileNode) parent; 
    if (parent == null || !parentNode.isDirectory() 
      || parentNode.listFiles() == null) { 
     return 0; 
    } 

    return parentNode.listFiles().length; 
} 

public boolean isLeaf(Object node) { 
    return (getChildCount(node) == 0); 
} 

public int getIndexOfChild(Object parent, Object child) { 
    FileNode parentNode = (FileNode) parent; 
    FileNode childNode = (FileNode) child; 

    return Arrays.asList(parentNode.list()).indexOf(childNode.getName()); 
} 

public void valueForPathChanged(TreePath path, Object newValue) { 

} 

public void addTreeModelListener(TreeModelListener l) { 
} 

public void removeTreeModelListener(TreeModelListener l) { 
} 
} 

class FileNode extends java.io.File { 

public FileNode(String directory) { 
    super(directory); 
} 

public FileNode(FileNode parent, String child) { 
    super(parent, child); 
} 

@Override 
public String toString() { 
    return getName(); 

} 
} 

jTree = new JTree(); 
jTree.setBounds(new Rectangle(164, 66, 180, 421)); 
jTree.setBackground(SystemColor.inactiveCaptionBorder); 
jTree.setBorder(BorderFactory.createTitledBorder(null, "", 
TitledBorder.LEADING, TitledBorder.TOP, new Font("Arial", 
         Font.BOLD, 12), new Color(0, 0, 0))); 
FileTreeModel model = new FileTreeModel(root); 
jTree.setRootVisible(false); 
jTree.setModel(model); 
expandAll(jTree); 

public void expandAll(JTree tree) { 

    int row = 0; 
    while (row < tree.getRowCount()) { 
     tree.expandRow(row); 
     row++; 
    } 
} 

답변

2

나는 당신이 setSelectedRow[1] 기능을 사용할 수 있습니다 생각합니다.

편집 :

import java.io.File; 
import java.util.Enumeration; 
import java.util.Iterator; 
import java.util.Vector; 
import javax.swing.event.TreeModelEvent; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreeModel; 
import javax.swing.tree.TreePath; 

class FileSystemModel implements TreeModel { 
    private File root; 

    private Vector listeners = new Vector(); 

    public FileSystemModel(File rootDirectory) { 
    root = rootDirectory; 
    } 

    public Object getRoot() { 
    return root; 
    } 

    public Object getChild(Object parent, int index) { 
    File directory = (File) parent; 
    String[] children = directory.list(); 
    return new File(directory, children[index]); 
    } 

    public int getChildCount(Object parent) { 
    File file = (File) parent; 
    if (file.isDirectory()) { 
     String[] fileList = file.list(); 
     if (fileList != null) 
    return file.list().length; 
    } 
    return 0; 
    } 

    public boolean isLeaf(Object node) { 
    File file = (File) node; 
    return file.isFile(); 
    } 

    public int getIndexOfChild(Object parent, Object child) { 
    File directory = (File) parent; 
    File file = (File) child; 
    String[] children = directory.list(); 
    for (int i = 0; i < children.length; i++) { 
     if (file.getName().equals(children[i])) { 
    return i; 
     } 
    } 
    return -1; 

    } 

    public void valueForPathChanged(TreePath path, Object value) { 
    File oldFile = (File) path.getLastPathComponent(); 
    String fileParentPath = oldFile.getParent(); 
    String newFileName = (String) value; 
    File targetFile = new File(fileParentPath, newFileName); 
    oldFile.renameTo(targetFile); 
    File parent = new File(fileParentPath); 
    int[] changedChildrenIndices = { getIndexOfChild(parent, targetFile) }; 
    Object[] changedChildren = { targetFile }; 
    fireTreeNodesChanged(path.getParentPath(), changedChildrenIndices, changedChildren); 

    } 

    private void fireTreeNodesChanged(TreePath parentPath, int[] indices, Object[] children) { 
    TreeModelEvent event = new TreeModelEvent(this, parentPath, indices, children); 
    Iterator iterator = listeners.iterator(); 
    TreeModelListener listener = null; 
    while (iterator.hasNext()) { 
     listener = (TreeModelListener) iterator.next(); 
     listener.treeNodesChanged(event); 
    } 
    } 

    public void addTreeModelListener(TreeModelListener listener) { 
    listeners.add(listener); 
    } 

    public void removeTreeModelListener(TreeModelListener listener) { 
    listeners.remove(listener); 
    } 
} 

그런 다음 당신은을 만들 것입니다 :

당신은 파일 시스템 (원본 source)에서 파일을 읽어들이는 tree model을하는 데 필요한 솔루션에 대한 스케치를 추가 버튼 리스너를 사용하여 새 파일을 만듭니다.

private void myButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    File f = new File(MY_DIR + "/file" + new Random().nextInt()); 
    try { 
     f.createNewFile(); 

     FileSystemModel model = new FileSystemModel(new File(MY_DIR)); 
     tree.setModel(model); 

     File root = (File) tree.getModel().getRoot(); 
     TreePath path = getPathFor(model, root, f); 

     tree.expandPath(path); 
     tree.setSelectionPath(path); 
    } 
    catch (IOException e) 
    { 

    } 
} 

마지막으로새로 생성 된 파일에 대한:

는 모델마다 시간을 재현하기 때문, 단지 비록 고도의 inneficient 당신이 그것을 할 수있는 방법에 대한 데모입니다
private TreePath getPathFor(FileSystemModel model, File root, File searched) 
{ 
    TreePath path = getPath(model, null, root, searched); 

    return path; 
} 

private TreePath getPath(FileSystemModel model, TreePath path, File parent, File searched) 
{ 
    if (path == null) 
    { 
     path = new TreePath(parent); 
    } 
    else if (parent.isDirectory()) 
    { 

     path = path.pathByAddingChild(parent); 
    } 

    if (parent.getAbsolutePath().equals(searched.getAbsolutePath())) 
    { 
     return path.pathByAddingChild(parent); 
    } 

    for (int i = 0; i < model.getChildCount(parent); i++) 
    { 
     File child = ((File)model.getChild(parent, i)).getAbsoluteFile(); 
     TreePath found = getPath(model, path, child, searched); 

     if (found != null) 
     { 
      return found; 
     } 
    } 

    return null; 
} 

. 더 나은 솔루션을 찾을 수있을 것이라고 확신합니다.

+0

더 자세히 설명해 주실 수 있습니까? – user236501

+0

새 파일을 첫 번째 행으로 설정하는 방법 파일은 알파벳순으로 정렬됩니다. – user236501

+0

곧 샘플을 스케치합니다 –

관련 문제