Как я могу решить проблему с отображением в JTree? - PullRequest
0 голосов
/ 01 апреля 2020

Я новичок в программировании. Я хотел создать общее приложение командира. У меня не было большей проблемы, но эту проблему я не могу решить.

Чтобы напечатать мое дерево, я использую функцию getChild () из моего класса TreeConstructor, который реализует из JTreeModel. Он прекрасно работает, но печатает весь путь к файлу или каталогу, а не только имя файла. Я думал о создании класса myJTree, который будет расширяться из класса JTree и переопределить функцию, которая печатает узел, но на самом деле я не знаю, где находится эта функция и ее имя.

класс TreeConstructor реализует TreeModel {

//To constructor we need to give path
//From where it it starts painting a tree
protected File root;
public TreeConstructor(File root) { this.root = root; }

//Giving root of a tree
@Override
public Object getRoot() {
    return root;
}

//Function to change root 
public void rootChanger(Object parent) {
    this.root = (File)parent;
}

@Override
public Object getChild(Object parent, int index) {
    String[] children = ((File)parent).list();
    if((children.length<=index)||(children == null))return null;
    return new File((File)parent,children[index]);
}

@Override
public int getChildCount(Object parent) {
    String[] children = ((File)parent).list();
    if(children == null) return 0;
    return children.length;
}

@Override
public boolean isLeaf(Object node) {  return ((File)node).isFile(); }

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

@Override
public void valueForPathChanged(TreePath path, Object newValue) {}

@Override
public void addTreeModelListener(TreeModelListener l) {}

@Override
public void removeTreeModelListener(TreeModelListener l) {}

Это мое приложение: https://i.stack.imgur.com/6AsiV.jpg

Буду благодарен за вашу помощь Даниэль

Ответы [ 3 ]

0 голосов
/ 01 апреля 2020

Как уже говорилось, вам нужен собственный рендер. Примерно так:

public class FileTreeRenderer 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);
        if (value instanceof File) {
            setText(((File) value).getName());
        }
        return this;
    }

}

А затем вам нужно установить рендерер в ваше дерево

tree.setCellRenderer(new FileTreeRenderer());

Также должны быть реализованы методы, определенные в интерфейсе TreeModel, чтобы обеспечить правильную работу вашего JTree. Особенно add / removeTreeModelListener. Они используются для предоставления возможности уведомлять дерево при изменении вашей модели (например, когда пользователь переименовывает узел).

0 голосов
/ 01 апреля 2020
public class Panels extends JPanel{

    File f1 = new File("C:\\Users");

    public TreeConstructor model = new TreeConstructor(f1);

    public JTree tree = new JTree(model);

    public JTextField pathPlace = new JTextField(100);

    JScrollPane scrollPane = new JScrollPane(tree);

    Panels(){

        pathPlace.setText("C:\\Users");

        tree.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getClickCount()==2) {      
                    System.out.println();
                    repaintingTree(pathPlace, tree, model);
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }
        });

        pathPlace.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                repaintingTree(pathPlace, tree, model, pathPlace.getText());

            }
        });

        setLayout(new BorderLayout());
        add(scrollPane);
        add(pathPlace,BorderLayout.NORTH);
    }

    public static void repaintingTree(JTextField pathPlace, JTree tree, TreeConstructor model){
        File place = new File(tree.getLastSelectedPathComponent().toString());
        if(place.isDirectory()) {
            pathPlace.setText(tree.getLastSelectedPathComponent().toString());
            model = new TreeConstructor(place);
            tree.setModel(model);
            tree.repaint();
    }}

    public static void repaintingTree(JTextField pathPlace, JTree tree, TreeConstructor model, String path){
        File place = new File(path);
        if(place.isDirectory()) {
            pathPlace.setText(path);
            model = new TreeConstructor(place);
            tree.setModel(model);
            tree.repaint();
            }
        else {
            JOptionPane.showMessageDialog(null, "Wrong directory");
        }
    }

вот код, где я использую JTree, могу ли я использовать ваш код для рендеринга с этим? Я не понимаю этого: /

0 голосов
/ 01 апреля 2020

Без дальнейшего примера кода я предлагаю вам поискать следующее:

  1. Воспользуйтесь функцией поиска, вы не первый с этой проблемой:)

Java JTree из каталога (показывает полный путь вместо только имени файла)

Напишите свой собственный рендерер

В зависимости от вашей реализации, это может быть самый простой способ написать свой собственный рендер

https://www.logicbig.com/tutorials/java-swing/jtree-renderer.html

...