有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何解决JTree中的显示问题?

我是编程初学者。我想创造一个全面的指挥官应用程序。我没有更大的问题,但那个问题我解决不了

要打印我的树,我使用我的类TreeConstructor中的函数getChild(),该类从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) 个答案

  1. # 1 楼答案

    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的代码我可以用你的代码来渲染这个吗? 我不明白:/

  2. # 3 楼答案

    如前所述,您需要自己的渲染器。比如:

    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的正确工作。尤其是添加/删除ReveTreeModelListener。它们用于在模型更改时(例如,当用户重命名节点时)通知树