【问题标题】:JTree not multi-selectable if it is editable如果 JTree 可编辑,则 JTree 不可多选
【发布时间】:2020-07-18 07:39:29
【问题描述】:

我有一个单一选择的 JTree。我想让树多选。为此,我添加了以下内容。

_myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
_myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
_myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

它不工作。我通过删除线进行测试

_myTree.setEditable(true);

它有效。 只有当它不可编辑时,我才能多选树中的节点。有没有办法解决这个问题?

在此处查看完整代码:

public class TreeSelectionOption {
  public static void main(String[] argv) {
    JTree tree = new JTree();
    tree.getSelectionModel().setSelectionMode(
                             TreeSelectionModel.SINGLE_TREE_SELECTION);

    tree.getSelectionModel().setSelectionMode(
                            TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
    tree.getSelectionModel().setSelectionMode(
                         TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
    DefaultMutableTreeNode book = null;
    DefaultMutableTreeNode category = null;
DefaultMutableTreeNode top = (DefaultMutableTreeNode)tree.getModel().getRoot();
category = new DefaultMutableTreeNode("Books for Java Programmers");
top.add(category);

//original Tutorial
book = new DefaultMutableTreeNode(new BookInfo
    ("The Java Tutorial: A Short Course on the Basics",
    "tutorial.html"));
category.add(book);

//Tutorial Continued
book = new DefaultMutableTreeNode(new BookInfo
    ("The Java Tutorial Continued: The Rest of the JDK",
    "tutorialcont.html"));
category.add(book);

//JFC Swing Tutorial
book = new DefaultMutableTreeNode(new BookInfo
    ("The JFC Swing Tutorial: A Guide to Constructing GUIs",
    "swingtutorial.html"));
category.add(book);

//Bloch
book = new DefaultMutableTreeNode(new BookInfo
    ("Effective Java Programming Language Guide",
    "bloch.html"));
category.add(book);

//Arnold/Gosling
book = new DefaultMutableTreeNode(new BookInfo
    ("The Java Programming Language", "arnold.html"));
category.add(book);
tree.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        super.mouseClicked(e);
    }
});
tree.setCellEditor(createTreeCellEditor() );
tree.setEditable(true);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(tree));
frame.setSize(380, 320);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
protected static TreeCellEditor createTreeCellEditor() {
  JTextField tf = new JTextField() {
      @Override
      public String getName() {
          return "Tree.cellEditor";
      }
  };
  DefaultCellEditor editor = new DefaultCellEditor(tf);

  // One click to edit.
  editor.setClickCountToStart(1);
  return editor;
}
private static class BookInfo {
  public String bookName;
  public String bookURL;

  public BookInfo(String book, String filename) {
      bookName = book;
      bookURL = filename;
  }

  public String toString() {
      return bookName;
  }
}
}

当指定单元格编辑器并在树上设置 setEditable(true) 时,多选停止工作。

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    将选择模型作为TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION 添加到树中。

    public class JTreeExample {
    
        public static void main(String[] argv) {
            JTree tree = new JTree();
            tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
            JFrame frame = new JFrame("JTree multi selection");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(tree));
            frame.setPreferredSize(new Dimension(400, 400));
            frame.setLocation(200, 200);
            frame.pack();
            frame.setVisible(true);
            tree.setEditable(true);
        }
    }
    

    之后就可以使用TreeSelectionListener来获取选中的节点了。

    https://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeSelectionListener.html

    【讨论】:

    • 嘿...我用简单的代码更新了我的答案。即使它设置为可编辑,您也可以一次选择多个节点。
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2011-10-22
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多