package org.dm.swingTest;
import java.awt.EventQueue;
import java.awt.event.InputEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class AppDemo extends JFrame {
private JPanel contentPane;
private JTextField textField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AppDemo frame = new AppDemo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public AppDemo() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
setTitle("测试");
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(30, 20, 196, 217);
contentPane.add(scrollPane);
final JTree tree = new JTree();
scrollPane.setViewportView(tree); textField = new JTextField();
textField.setBounds(252, 35, 172, 27);
contentPane.add(textField);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {//当我们在JTree上点选任何一个节点,都会触发TreeSelectionEvent事件
//根据数字 0、1、2··区分根节点、子节点
// int z = tree.getSelectionCount();
// System.out.println(z);
// String name=((DefaultMutableTreeNode) tree.getSelectionPath().getPathComponent(z)).toString();
//获取当前节点和前面所有节点的值
// TreePath note = tree.getSelectionPath();
//获取当前选择节点的值
//方法一
DefaultMutableTreeNode note = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
// String name = note.toString();//获得这个结点的名称
//方法2
// String name=((DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent()).toString();
// 获取选中节点的父节点
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) note.getParent();
//获取父节点的子节点(首个子节点和最后一个子节点)
DefaultMutableTreeNode FirstChild = (DefaultMutableTreeNode) note.getFirstChild();
DefaultMutableTreeNode LastChild = (DefaultMutableTreeNode) note.getLastChild();
System.out.println("选中节点的子节点"+FirstChild.toString());
if (parent == null) {
return;
}
// 获取选中节点的节点索引
int selectedIndex = parent.getIndex(note);
// System.out.println("选中节点的节点索引:"+selectedIndex);
textField.setText(parent.toString());
// 判断是否为树叶节点,若是则显示文件内容,若不是则不做任何事。
// if (note.isLeaf()) {
// /*
// * 取得文件的位置路径,System.getProperty("user.dir")可以取得目前工作的路径,
// * System.getProperty("file.separator")是取得文件分隔符,例如在window环境的
// * 文件分陋符是"\",而Unix环境的文件分隔符刚好相反,是"/".利用System.getProperty()
// * 方法你可以取得下列的信息: java.version 显示java版本 java.endor 显示java制造商
// * java.endor.url 显示java制造商URL java.home 显示java的安装路径
// * java.class.version 显示java类版本 java.class.path 显示java classpath
// * os.name 显示操作系统名称 os.arch 显示操作系统结构,如x86 os.version 显示操作系统版本
// * file.separator 取得文件分隔符 path.separator 取得路径分隔符,如Unix是以“:”表示
// * line.separator 取得换行符号,如Unix是以"\n"表示 user.name 取得用户名称 user.home
// * 取得用户家目录(home directory),如Windows中Administrator的家目 录为c:\Documents
// * and Settings\Administrator user.dir 取得用户目前的工作目录.
// */
// String filepath = "file:" + System.getProperty("user.dir")
// + System.getProperty("file.separator") + note;
// System.out.println(filepath);
//// try {
//// // 利用JEditorPane的setPage()方法将文件内容显示在editorPane中。若文件路径错误,则会产生IOException.
//// editorPane.setPage(filepath);
//// } catch (IOException ex) {
//// System.out.println("找不到此文件");
//// }
// }
}
});
//添加鼠标事件
tree.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
// 默认单击鼠标一下
// if(evt.getClickCount()==1){
// System.out.println("一下");
// }
//点击鼠标左键两下
// 1 左键
// 2 中键(Sun Mouse)
// 3 右键
if(evt.getModifiers()==InputEvent.BUTTON1_MASK && evt.getClickCount()==2) {
System.out.println("两下");
}
}
});
}
}
相关推荐
TreeNode定义了一系列方法,如`getChildCount()`用来获取子节点的数量,`getParent()`获取父节点,以及判断是否为叶子节点等。在实际编程中,我们很少直接实现TreeNode接口,而是选择使用DefaultMutableTreeNode类,...
6. **自定义TreeModel**:如果需要更复杂的逻辑,例如根据父节点的选中状态自动改变子节点的状态,可能需要创建一个自定义的TreeModel。这可能涉及到实现DefaultTreeModel或直接扩展AbstractTreeModel。 7. **Swing...
在Java Swing库中,`JTree`组件是一个用于展示树形数据结构的可视化元素,它允许用户通过交互来浏览和操作这些数据。当我们在`JTree`中添加了复选框(CheckBox),我们增强了它的功能,使用户可以对每个节点进行选择...
这个接口包含了获取父节点、子节点、子节点数量、索引等方法,以及判断节点是否为叶子节点和是否允许有子节点的方法。TreeNode 接口通常不直接实现,而是通过扩展它的子接口或类来使用,比如 DefaultMutableTreeNode...
在这个例子中,关键的特性是,如果一个父节点的子节点中有一个或多个没有被选中,那么这个父节点及其所有上级父节点都不会被标记为选中状态。这是因为通常我们希望在这样的情况下,只有当所有的子节点都被选中时,父...
在实际项目中,你可能还需要考虑更多的细节,例如处理子节点的复选状态同步、处理父节点的复选状态根据子节点状态自动更新等。在`isNodeSelected`方法中,你需要根据具体的数据模型来判断节点是否被选中。同时,你也...
7. **操作JTree**:JTree提供了多种方法来操作树,如expandRow()用于展开指定行,collapseRow()用于折叠行,getSelectionPath()获取当前选中的路径。 JTree的一些关键属性和方法包括: - **rootVisible**:控制...
- **TreeNode接口**:定义了树节点的基本行为,如获取父节点、子节点等。 - **MutableTreeNode接口**:扩展了`TreeNode`接口,增加了修改节点的能力。 - **DefaultMutableTreeNode类**:实现了`MutableTreeNode`...
如果选中该结点使其父节点的所有子结点都被选中,则选中其父结点。如果某个结点被手动取消选中,那么它的所有子孙结点都应该被取消选中;如果该结点的父结点处于选中状态,则取消选中其父结点。 最后,在实现...
通过`DefaultMutableTreeNode`类创建节点,并将其添加到父节点中。 ```java DefaultMutableTreeNode root = new DefaultMutableTreeNode("Primary database"); DefaultMutableTreeNode node1 = new ...
它用于创建和显示树状结构,通常用于展示具有父节点和子节点的数据模型。`JTree`提供了丰富的功能,如展开/折叠节点、选择节点、添加/删除节点等。 2. **`DefaultTreeModel`和`TreeNode`** `JTree`的数据模型通常...
- `TreeModel` 接口定义了树的数据结构,包括获取节点数量、获取父节点、获取子节点等方法。 - `DefaultTreeModel` 是一个基本的树模型实现,基于 `DefaultMutableTreeNode`。 4. **事件监听**: - `...
使用java.io.File类获取系统的目录列表,并遍历目录,为每个目录和文件创建一个新的DefaultMutableTreeNode,然后将其添加到父节点。可以使用`listFiles()`方法来获取目录下的文件和子目录。 ```java File ...
例如,如果你有一个树结构,其中父节点代表一组子节点,那么当子节点中有部分被选中时,父节点应显示为不确定状态。 JTree是Swing中用于展示层次数据的组件,它通常用于显示文件系统、数据库结构或其他具有层级关系...
3. **级联选择**:如果父节点被选中,其所有子节点也应该被选中;反之,如果父节点被取消选中,其所有子节点也应该被取消选中。 4. **事件监听**:当节点的状态改变时,可能需要触发一些动作,例如更新其他界面元素...
2. **递归添加子节点**:`addFilesAndDirsToTree`函数是一个递归函数,它会遍历指定目录下的所有文件和子目录,创建相应的`DefaultMutableTreeNode`并添加到父节点。 ```java private void addFilesAndDirsToTree...
编写单元测试来验证不同场景下的正确性,包括父节点选中时子节点是否自动选中,子节点选中时父节点是否自动选中,以及多选框的正常操作。 通过以上步骤,我们可以在Java中实现一个具有多选功能的树形菜单,使得...