У меня есть JTree, который показывает файлы и папки каталога. Также есть кнопка, которая отключает некоторые из узлов в JTree
(используя DefaultTreeCellRenderer
).Как обновить JTree UI
Элемент отключается, когда я нажимаю кнопку, но JTree не показывает его как отключенный элемент. До тех пор, пока я не щелкнул где-нибудь или не включил элементы дерева, он также отобразит отключенный вид элемента.
Я знаю, что существует метод reload()
для DefaultTreeModel
. Но я использую индивидуальную модель. Так что этот метод не работает. Вот модель, которую я использую, чтобы просмотреть список файлов и папок: FileSystemModel
И это мой код:
public class FileViewer {
JFrame frame;
JPanel panel;
JTree tree;
File root;
public ArrayList<String> disabledNodes = new ArrayList<String>();
public FileViewer(){
frame = new JFrame("File Viewer");
panel = new JPanel(new BorderLayout());
root = new File("D:\\Documents\\A X");
FileSystemModel model = new FileSystemModel(root);
tree = new JTree();
tree.setModel(model);
panel.add(tree, BorderLayout.CENTER);
JButton press = new JButton("Press");
panel.add(press, BorderLayout.SOUTH);
press.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
disabledNodes.add("folder1");
}
});
tree.setCellRenderer(new CustomDefaultTreeCellRenderer());
frame.add(panel);
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
new FileViewer();
}
class CustomDefaultTreeCellRenderer extends DefaultTreeCellRenderer{
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus){
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
File node = (File)value;
String name = node.getName();
for(String element : disabledNodes){
if(name.equals(element)){
this.setEnabled(false);
}
}
return this;
}
}
}
Однако в ActionListener
кнопки, я добавил tree.updateUI();
и он отлично работал. Но почему-то я слышал, что обновление пользовательского интерфейса является плохой практикой, так как позже это вызовет другие проблемы. Так использует updateUI
correct here? или есть лучший способ сделать обновление UI
кликами и взаимодействиями пользователей?
Примечание. Я не буду добавлять или удалять файлы из дерева, мне просто нужно включить/отключить узлы. UPDATE: Я просто замечаю, что есть опция repaint()
, которая выполняет аналогичную функцию для меня. Но все-таки, это правильный способ освежить JTree?