JTree demo
JFrame居中
方法一:
setLocationRelativeTo(null);
注意:必须在整个frame初始化完成后再加上此语句,否则将显示在屏幕右下角
方法二:
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
/** 屏幕宽度 */
private int screenWidth = screenSize.width;
/** 屏幕高度 */
private int screenHeight = screenSize.height;
jFrame.setLocation((screenWidth - FRAME_WIDTH) / 2, (screenHeight - FRAME_HEIGHT) / 2);
package component.tree; import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit; import javax.swing.JDialog;
import javax.swing.JTree; /*2015-5-26*/
public class MyDialog extends JDialog{ private JTree tree=new JTree();
public MyDialog(Dialog owner) {
super(owner,true);
setSize(800,600);
add(tree);
setLocation(getCenterPoint());
} private Point getCenterPoint(){
int windowWidth = this.getWidth(); //获得窗口宽 int windowHeight = this.getHeight(); //获得窗口高 Toolkit kit = Toolkit.getDefaultToolkit(); //定义工具包 Dimension screenSize = kit.getScreenSize(); //获取屏幕的尺寸 int screenWidth = screenSize.width; //获取屏幕的宽 int screenHeight = screenSize.height; //获取屏幕的高
return new Point(screenWidth / 2 - windowWidth / 2, screenHeight / 2 - windowHeight / 2);//窗口居中时的x,y } public JTree getTree() {
return tree;
} }
package component.tree; import static common.SwingConsole.run; import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel; /*2015-5-26*/
public class Main extends JFrame { public Main() throws HeadlessException {
super();
JButton button=new JButton("OK");
button.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
MyDialog dlg=new MyDialog(null); DefaultMutableTreeNode root = new DefaultMutableTreeNode("资源管理器");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("我的公文包");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("我的电脑");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("收藏夹");
DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("Readme"); DefaultTreeModel treeModel = new DefaultTreeModel(root); /*
* DefaultTreeModel类所提供的insertNodeInto()方法加入节点到父节点的数量.
* 利用DefaultMutableTreeNode类所提供的getChildCount()方法取得目前子节点的数量.
*/
treeModel.insertNodeInto(node1, root, root.getChildCount());
treeModel.insertNodeInto(node2, root, root.getChildCount());
treeModel.insertNodeInto(node3, root, root.getChildCount());
treeModel.insertNodeInto(node4, root, root.getChildCount()); DefaultMutableTreeNode leafnode = new DefaultMutableTreeNode("公司文件"); // DefaultTreeModel类所提供的insertNodeInto()方法加入节点到父节点的数量.
treeModel.insertNodeInto(leafnode, node1, node1.getChildCount());
leafnode = new DefaultMutableTreeNode("个人信件");
treeModel.insertNodeInto(leafnode, node1, node1.getChildCount());
leafnode = new DefaultMutableTreeNode("私人文件");
treeModel.insertNodeInto(leafnode, node1, node1.getChildCount()); leafnode = new DefaultMutableTreeNode("本机磁盘(C:)");
treeModel.insertNodeInto(leafnode, node2, node2.getChildCount());
leafnode = new DefaultMutableTreeNode("本机磁盘(D:)");
treeModel.insertNodeInto(leafnode, node2, node2.getChildCount());
leafnode = new DefaultMutableTreeNode("本机磁盘(E:)");
treeModel.insertNodeInto(leafnode, node2, node2.getChildCount()); DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("网站列表");
treeModel.insertNodeInto(node31, node3, node3.getChildCount());
leafnode = new DefaultMutableTreeNode("奇摩站");
treeModel.insertNodeInto(leafnode, node3, node3.getChildCount());
leafnode = new DefaultMutableTreeNode("职棒消息");
treeModel.insertNodeInto(leafnode, node3, node3.getChildCount());
leafnode = new DefaultMutableTreeNode("网络书店");
treeModel.insertNodeInto(leafnode, node3, node3.getChildCount()); dlg.getTree().setModel(treeModel);
dlg.setVisible(true);
}
});
add(button);
} public static void main(String[] args) {
run(new Main(),200,100);
} }
package common; import javax.swing.JFrame;
import javax.swing.SwingUtilities; /*2015-5-26*/
public class SwingConsole { public static void run(final JFrame frame,final int width,final int height){
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
frame.setSize(width, height);
frame.setTitle(frame.getClass().getSimpleName());
frame.setVisible(true);
}
});
}
}
http://www.iteedu.com/plang/java/jtswingchxshj/56.php
http://www.blogjava.net/santicom/archive/2011/03/23/346796.html
http://www.cnblogs.com/happyPawpaw/archive/2013/01/10/2854675.html
http://etwo.iteye.com/blog/1458414
package swing.tree; import static common.SwingConsole.run; import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
/*2015-6-1*/
public class JTreeDemo extends JFrame{
private static final long serialVersionUID = 1L; public JTreeDemo() {
JTree tree=new JTree(); /* DefaultMutableTreeNode root=new DefaultMutableTreeNode("我的电脑");
DefaultMutableTreeNode c=new DefaultMutableTreeNode("C:");
DefaultMutableTreeNode d=new DefaultMutableTreeNode("D:"); DefaultMutableTreeNode c1=new DefaultMutableTreeNode("C1");
DefaultMutableTreeNode c2=new DefaultMutableTreeNode("C2");*/ Dir dir=new Dir("root", "My computer", "Y");
Dir c=new Dir("C:", "第一个盘", "N");
Dir d=new Dir("D:", "第二个盘", "Y");
Dir c1=new Dir("c1", "盘一C1", "Y");
Dir c2=new Dir("c2", "盘一C2", "Y"); DefaultMutableTreeNode root=new DefaultMutableTreeNode(dir);
DefaultMutableTreeNode cNode=new DefaultMutableTreeNode(c);
DefaultMutableTreeNode dNode=new DefaultMutableTreeNode(d); DefaultMutableTreeNode c1Node=new DefaultMutableTreeNode(c1);
DefaultMutableTreeNode c2Node=new DefaultMutableTreeNode(c2); DefaultTreeModel model=new DefaultTreeModel(root);
model.insertNodeInto(cNode, root, root.getChildCount());
model.insertNodeInto(dNode, root, root.getChildCount());
model.insertNodeInto(c1Node, cNode,cNode.getChildCount());
model.insertNodeInto(c2Node, cNode, cNode.getChildCount()); tree.setModel(model); this.add(tree);
tree.setSize(400, 200); } public static void main(String[] args) {
run(new JTreeDemo(), 800, 600);
} } class Dir{
private String path;
private String name;
private String access;
public Dir(String path, String name, String access) {
super();
this.path = path;
this.name = name;
this.access = access;
} @Override
public String toString() {
return path;//GUI上树显示的节点信息
} }
package swing.tree; import static common.SwingConsole.run; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter; import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.border.Border;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath; import com.sun.security.auth.UserPrincipal; /*2015-6-1*/
public class JTreeDemo extends JFrame {
private static final long serialVersionUID = 1L; private JTree tree;
private DefaultMutableTreeNode root;
private DefaultTreeModel model;
private JPanel content; private Border inBorder = BorderFactory.createLineBorder(Color.LIGHT_GRAY); public JTreeDemo() {
initGUI();
initListener();
} private void initGUI() {
content = new JPanel();
content.setLayout(new BorderLayout());
getContentPane().add(content);
root = new DefaultMutableTreeNode();
model = new DefaultTreeModel(root); for (int i = 1; i <= 3; i++) {
DemoNode cate = new DemoNode(produceImage("arrow_left.png"), new UserPrincipal("我的好友" + i));
for (int j = 1; j <= 3; j++) {
DemoNode node = new DemoNode(produceImage("avatar.png"), new UserPrincipal("好友" + i + "-" + j), "人生若只如初见");
cate.add(node);
}
root.add(cate);
} tree = new JTree();
tree.setModel(model);
tree.setRootVisible(false);
tree.setToggleClickCount(1);
tree.setCellRenderer(new DemoRenderer());// 更改节点图标
tree.putClientProperty("JTree.lineStyle", "None");// 去掉父子节点之间的线条
content.add(tree, BorderLayout.CENTER);
} private Icon produceImage(String name) {
ImageIcon backImage = new ImageIcon(getClass().getClassLoader().getResource(name));
return backImage;
} private void initListener() {
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
TreePath path = tree.getSelectionPath();
if (null != path) {
Object object = path.getLastPathComponent();
DemoNode node = (DemoNode) object;
// 二级节点(分组)咱就不管了
if (node.getLevel() == 2) {
node.nodeContent.setBorder(inBorder);
node.nodeContent.setBackground(Color.ORANGE);
// 去掉选中之外其他所有节点的特效
for (int i = 0; i < root.getChildCount(); i++) {
DemoNode cate = (DemoNode) root.getChildAt(i);
// 三级节点
for (int j = 0; j < cate.getChildCount(); j++) {
DemoNode buddy = (DemoNode) cate.getChildAt(j);
if (node != buddy) {
buddy.nodeContent.setBorder(null);
buddy.nodeContent.setBackground(null);
}
model.reload(buddy);
}
}
model.reload(node);
}
}
}
});
tree.addMouseMotionListener(new MouseMotionAdapter() {
// 没有使用moseEnter事件,是因为此方法里面没有可以获取当前节点的API
// 大家若是知道有更好的方法,可以告诉我一下,感激不尽
// 还有,大家看到如下方法,循环太多,如果节点过多的话,效率就不行了,但是事件只能加到jtree上,如果能加到我重绘的UI上就好了。。。
@Override
public void mouseMoved(MouseEvent e) {
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if (null != path) {
Object object = path.getLastPathComponent();
DemoNode node = (DemoNode) object; // 不管三七二十一,先把自己的特效加上再说
// 这里因为是鼠标移动事件,触发太快了,所以要判断是否在当前节点上移动鼠标
if (node.getLevel() == 1 && node.cateContent.getBorder() != inBorder) {
node.cateContent.setBorder(inBorder);
}
if (node.getLevel() == 2 && node.nodeContent.getBorder() != inBorder) {
node.nodeContent.setBorder(inBorder);
}
model.reload(node); // 去掉选中之外其他所有节点的特效
for (int i = 0; i < root.getChildCount(); i++) {
DemoNode cate = (DemoNode) root.getChildAt(i);
if (node != cate && cate.cateContent.getBackground() != Color.ORANGE) {
cate.cateContent.setBorder(null);
}
model.reload(cate);
// 三级节点
for (int j = 0; j < cate.getChildCount(); j++) {
DemoNode buddy = (DemoNode) cate.getChildAt(j);
if (node != buddy && buddy.nodeContent.getBackground() != Color.ORANGE) {
buddy.nodeContent.setBorder(null);
}
model.reload(buddy);
}
}
}
}
});
} public static void main(String[] args) {
run(new JTreeDemo(), 300, 600);
} } class UserObject {
private String path;
private String name;
private String access; public UserObject(String path, String name, String access) {
super();
this.path = path;
this.name = name;
this.access = access;
} @Override
public String toString() {
return name;// GUI上树显示的节点信息
}
}
package swing.tree; import java.awt.Component;
import java.awt.Dimension; import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.tree.DefaultMutableTreeNode; /*2015-6-7*/
public class DemoNode extends DefaultMutableTreeNode{ private static final long serialVersionUID = 1L;
/** 图片 */
private Icon icon;
/** 节点信息 */
private Object userObject;
/** 签名 */
private String sign; public JPanel cateContent;
public JPanel nodeContent; public JLabel iconLabel;
public JLabel nameLabel; public JLabel signLabel; /**
* 初始化分组节点
* @param name 名称
*/
public DemoNode(Icon icon, Object name) {
this.icon = icon;
this.userObject = name;
// 初始化UI
initCateGUI();
} /**
* 初始化好友节点
* @param icon 头像
* @param nick 昵称
* @param sign 签名
*/
public DemoNode(Icon icon, Object nick, String sign) {
this.icon = icon;
this.userObject = nick;
this.sign = sign;
// 初始化UI
initNodeGUI();
} /**
* 自定义分组UI
*/
private void initCateGUI() {
cateContent = new JPanel();
cateContent.setLayout(null);
// cateContent.setOpaque(false);
// 这里大家注意,当我们写好UI之后可能会发现他的颜色不太对,
// 这时候千万不要用上面那句,不然当我们想再次改变其颜色的时候,就生效不了
// 红绿蓝分别为255的这个颜色趋近于透明,我们可以用它来代替setOpaque
// cateContent.setBackground(new Color(255,255,255));
// 突然发现置成null也可以
cateContent.setBackground(null);
cateContent.setPreferredSize(new Dimension(300, 25));
// cateContent.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); iconLabel = new JLabel(icon);
iconLabel.setBounds(6, 5, 20, 16);
cateContent.add(iconLabel); nameLabel = new JLabel(userObject.toString());
nameLabel.setBounds(23, 0, 132, 28);
cateContent.add(nameLabel);
} /**
* 自定义好友UI
*/
private void initNodeGUI() {
nodeContent = new JPanel();
nodeContent.setLayout(null);
// nodeContent.setOpaque(false);
nodeContent.setBackground(null);
nodeContent.setPreferredSize(new Dimension(300, 50));
// nodeContent.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); iconLabel = new JLabel(icon);
iconLabel.setBounds(8, 4, 39, 42);
nodeContent.add(iconLabel); nameLabel = new JLabel(userObject.toString());
nameLabel.setBounds(59, 5, 132, 19);
nodeContent.add(nameLabel); signLabel = new JLabel(sign);
signLabel.setBounds(59, 28, 132, 17);
nodeContent.add(signLabel);
} /**
* 将自定义UI返回给渲染器 <br/>
* 供渲染器调用,返回的必须是一个Component
* @return
*/
public Component getCateView() {
return cateContent;
} /**
* 将自定义UI返回给渲染器 <br/>
* 供渲染器调用,返回的必须是一个Component
* @return
*/
public Component getNodeView() {
return nodeContent;
} }
package swing.tree; import java.awt.Component; import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer; public class DemoRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L; @Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
// DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
// // 根节点从0开始,依次往下
// // 分组
// if (node.getLevel() == 1) {
// if (expanded) {
// this.setIcon(new ImageIcon(getClass().getClassLoader().getResource("arrow_down.png")));
// } else {
// this.setIcon(new ImageIcon(getClass().getClassLoader().getResource("arrow_left.png")));
// }
// }
// // 好友
// if (node.getLevel() == 2) {
// this.setIcon(new ImageIcon(getClass().getClassLoader().getResource("qq_icon.png")));
// }
// this.setText(value.toString());
// return this; // 大家这里注意,我为了节省时间,所以就没有写两个node类
// 所有的代码写在了同一个类中,然后根据不同的节点来调用相应的方法
DemoNode node = (DemoNode) value;
if (node.getLevel() == 1) {
if (expanded) {
node.iconLabel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("arrow_down.png")));
} else {
node.iconLabel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("arrow_left.png")));
}
return node.getCateView();
}
if (node.getLevel() == 2) {
node.iconLabel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("qq_icon.png")));
return node.getNodeView();
}
return this;
} }
http://www.iteye.com/topic/1138211
JTree demo的更多相关文章
- whdxlib
1 数据库系统实现 实 验 指 导 书 齐心 彭彬 计算机工程与软件实验中心 2016 年 3 月2目 录实验一.JDBC 应用程序设计(2 学时) ......................... ...
- JSplitPane demo
package example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; imp ...
- JTree 添加 , 删除, 修改
package com.swing.demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.eve ...
- JTree 常用方法
package com.swing.demo; import java.awt.Component; import java.awt.event.MouseAdapter; import java.a ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo
有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...
- 在线浏览PDF之PDF.JS (附demo)
平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#skill 下载地址:http://mozilla.gith ...
- 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo
Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
随机推荐
- 怎样在Android本地视频播放器开发
在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...
- [Network]Wireless and Mobile
Wireless 1 Introduction 1.1 Elements 1. Wireless Hosts Wireless does not mean mobility. 2. Base Stat ...
- linux根据部署jenkins
1. Jenkins 下载 Jenkins 下载网址:http://jenkins-ci.org/ 2. Jenkins 安装 (1) 安装JDK JDK下载:http://www.oracle.co ...
- 查看mysql数据库表大小和最后修改时间
查看mysql数据库表相关信息如表大小.修改更新等信息,可以通过以下方式: 一 show table status like ’table_name‘ ; 二 在infortmation_sche ...
- WPF案例 (四) 模拟Windows7桌面任务栏
原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...
- 伪教练技术培训之殇-2013年9月江西IDC拓行榜与综述
纠集几个人,然后培训所谓的教练技术培训. 培训的人一期又一期的参与,国学.佛学.超能量,无所不用其极,然后就是疯狂的拿人头,邀请朋友加盟. 有甚者还披上“科技”的外衣,用“水知道答案”这种早被公知指出 ...
- Android使用应用程序资源(、颜色数组、尺寸、弦、布尔、整型)
一.Android资源分类详细解释 1.Android资源类别 Android中的资源分为两大类 : 可直接訪问的资源, 无法直接訪问的原生资源; -- 直接訪问资源 : 这些资源能够使用 R. ...
- Nagios+pnp4nagios+rrdtool 安装配置为nagios添加自定义插件(三)
nagios博大精深,可以以shell.perl等语句为nagios写插件,来满足自己监控的需要.本文写mysql中tps.qps的插件,并把收集到的结果以图形形式展现出来,这样输出的结果就有一定的要 ...
- 去掉word中向下的箭头^l----->^p
去掉word中向下的箭头 在网页上复制文章到word中,会发现有很多向下的箭头,这些 符号叫做软回车符.如何去掉这些向下的箭头呢.步骤如下: 方法/步骤 按Ctrl+H,弹出全局替换窗口,输入查找内容 ...
- iOS一些推荐的学习路径发展
iOS论坛里有朋友要求回答帖子,帖子的标题是: 想学IOS开发高阶一点的东西,从何開始,然后我吧啦吧啦回答写了非常多.既然敲了那么多字,我就把我写的回复也贴到博客里来分享.希望能对大家有帮助.欢迎大家 ...