【问题标题】:How can I solve problem with display in JTree?如何解决 JTree 中的显示问题?
【发布时间】:2020-07-13 15:58:36
【问题描述】:

我是编程初学者。我想创建总指挥官应用程序。我没有更大的问题,但我无法解决。

要打印我的树,我使用从 JTreeModel 实现的类 TreeConstructor 中的函数 getChild()。它工作得很好,但它不仅打印文件名,还打印文件或目录的所有路径。我想过创建 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

我会感谢你的帮助丹尼尔

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    如果没有进一步的代码示例,我建议您查找以下内容:

    1. 使用搜索功能,你不是第一个遇到这个问题的:)

    Java JTree from directory (shows full path instead of just the name of the file)

    1. 编写自己的渲染器

    根据您的实现,这可能是编写自己的 Render 的最简单方法

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

    【讨论】:

      【解决方案2】:

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

      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 的正确工作。特别是添加/删除TreeModelListener。它们用于在您的模型更改时(例如,当用户重命名节点时)提供通知树的可能性。

      【讨论】:

      • 我在下面发表了评论
      • 例如,您可以为FileTreeRenderer 创建一个新的类文件。然后在设置其模型之后设置渲染器。
      【解决方案3】:
      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 的代码 我可以使用您的代码来渲染吗? 我不明白:/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 2015-10-22
        • 2017-11-03
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多