Как выделить новый созданный файл в JTREE -- swing поле с участием file поле с участием jtree поле с участием selected пол Связанный проблема

How to highlight the new created file in JTree


0
vote

проблема

русский

Я хочу сделать это, когда я нажимаю кнопку, она создаст новый файл. Тогда 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++;     } }   
Английский оригинал

I want to make it like when I click a button, it will create a new file. Then the jTree will highlight the new file. Below are my code. Currently I create new file, i will show the new file but no highlight the file.

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++;     } } 
</div
           

Список ответов

2
 
vote
vote
Лучший ответ
 
<Р> Я думаю, что вы могли бы использовать <код> setSelectedRow [1] функция.

<сильный> EDIT: Добавлен эскиз для решения

<Р> Вы должны иметь <код> tree model , который будет читать файлы из файловой системы (оригинальный источник ):
 <код> 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);   } }   
<Р> Затем вы можете создать кнопку слушателя, чтобы создать новый файл:
 <код> 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)     {      } }   
<Р> Наконец, вы бы вернуть <код> TreePath для вновь созданного файла:
 <код> 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; }   
<Р> Это просто демо о том, как вы могли бы сделать это, хотя его весьма inneficient, потому что он воссоздает Типовом каждый раз. Я уверен, что вы можете придумать лучшее решение.
 

I think you could use the setSelectedRow [1] function.

EDIT: Added a sketch for the solution

You need to have a tree model that will read the files from the file system (original source):

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

Then you would create a button listener to create the new file:

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)     {      } } 

Finally you would return the TreePath for the newly created file:

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

This is just a demo on how you could do it, though its highly inneficient, because it recreates the model every time. I'm sure you can come up with a better solution.

</div
 
 
         
         

Связанный проблема

3  Проблема с удалением последнего ряда jtable  ( Problem with removing last row of jtable ) 
Это мой первый раз, прося здесь, так что прости меня, если что-то не подходит, и извините, если мой английский не очень хорош. Ну, чтобы сделать его коротки...

0  EventListener возвращает значение  ( Eventlistener returning a value ) 
сначала есть пример класса с 3 строковыми переменными. Пример класса { Название строки1; Название строки2; Название строки3; } 2 Мы создаем объ...

1  jtextfield.settext Ошибка. Несовместимые типы: void не может быть преобразован в строку [дубликат]  ( Jtextfield settext error incompatible types void cannot be converted to string ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже имеет ответ здесь : ...

22  Сокет с использованием в качании апплета  ( Socket using in a swing applet ) 
Я должен сделать сервер и AMP; Клиент в Java, основанный на качании и GUI.I, чтобы сделать как-то розетку, которое будет переходить с сервера к клиенту и от к...

0  Jscrollpane Scrollbar не отображается до тех пор, пока rowsorter.togglesortorder () называется  ( Jscrollpane scrollbar does not appear until after rowsorter togglesortorder is ) 
Я заметил, что когда у меня есть JTable с помощью таблетки, содержащегося jscrollepane, вертикальная полоса прокрутки не появляется до тех пор, пока я не созд...

2  Мой бар jmenu не показывает  ( My jmenu bar is not showing up ) 
Мой jmenubar не показывает, когда я запускаю свое приложение. Как я могу это исправить ?? Поэтому, когда я бегу свой Jframe, мне нужно увидеть мой jmenubar ...

26  Как добавить кнопку в ряд jtable в качелях java  ( How to add button in a row of jtable in swing java ) 
Я сделал один важный графический интерфейс, который имел jtable с некоторыми строками и столбцами. Как я должен добавить кнопку для строки в JTable? ...

-4  Auto Нажмите один раз в JFrame  ( Auto click once in jframe ) 
Как я могу сделать мою программу автоматически делать щелкнуть мышью только один раз каждый раз после запуска метода на моем Jframe? Может быть достигну...

0  Регистрационная форма Null указатель исключений в Java Netbeans 7.01  ( Registration form null pointer exception in java netbeans 7 01 ) 
<Р> Я создал регистрационную форму на мой собственный проект. Он успешно работает, когда я исполняю свой код. Но когда я заполнить форму и нажмите кнопку Вход,...

1  Почему listcellRenderer вызывается, когда setseleceditem () используется?  ( Why is listcellrenderer called when setselecteditem is used ) 
У меня есть jcombobox то есть Предназначен для выбора для выбора для выбора для выбора font . Чтобы позволить предварительному просмотру шрифта, когда поль...

25  Java GUI альтернативы [закрыты]  ( Java gui alternatives ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

-1  Как добавить JTable для JPanel  ( How to add a jtable to a jpanel ) 
Мой вопрос может показаться немного глупо, но каждый раз, когда я использую качели, у меня проблемы с таблицами. Таким образом, я работаю над школьным проекто...

0  Проблемы с ценностями цвета в Java  ( Trouble with colours values in java ) 
Я создаю класс под названием прямоугольник, где он получает два понита (исход один и последний), и они используются функциями FillRect () и Drawrect (), котор...

1  Нахождение источника действий в jbutton [] [] Array без использования вложенных петель?  ( Finding the source of an actionevent in a jbutton array without using nested ) 
Я создал <код> JFrame приложение с массивом 8x8 <код> JButtons[][] , соответствующий массиву выбранного & amp; Освобожден <код> ImageIcon s. Когда нажата кн...

0  Макет сетки Просмотреть положение качания Java  ( Grid layout view java swing component position ) 
У меня проблема с использованием макета сетки в Java Swing. Я создаю панель и добавляю <код> GridLayout с 4 столбцами и 2 строками. Я пытаюсь добавить <код...