(总结)Swing组件的使用---表格(JTable)和树(JTree)

                                                                                 Swing组件的使用---表格(JTable)和树(JTree)

一:表格(JTable):

  1.基本概念:

    表格(JTable)是Swing 新增加的组件,主要是为了将数据以表格的形式显示.给显示大块数据提供了简单的机制.

  2.常用构造方法:

 * JTable():使用系统默认的模型创建一个JTable 实例.
 * JTable(int numRows,int numColumns):创建一个使用DefaultTableModel 指定行、列的空表格。
 * JTable(Object[ ][ ] rowData,Object[ ][ ] columnNames):创建一个显示二维数据的表格。

           可以直接使用表格列名数组和表格数据数组来创建表格.

 * JTable(TableModel dm):创建一个指定数据模式和默认字段模式的JTable 实例。

           通常用数据模型类的对象来保存数据,而表格模型是通过表格列名数组和表格数据数组来创建的.

 3.常用方法:


4.综合案例:

代码1:

public class JTableDemo1 extends JFrame {

	//定义表格
	JTable table;
	//定义滚动条面板(用以使表格可以滚动)
	JScrollPane scrollPane;
	//定义数据模型类的对象(用以保存数据),
	DefaultTableModel tableModel;

	public JTableDemo1() {
		super();
		setTitle("表格模型与表格");

		scrollPane = new JScrollPane();
		
		// 定义表格列名数组
		String[] columnNames = { "A", "B","C" };
		// 定义表格数据数组
		String[][] tableValues = { { "A1", "B1","C1" }, { "A2", "B2","C2" },
				{ "A3", "B3","C3" }, { "A4", "B4","C4" } };

		// 创建指定表格列名和表格数据的表格模型类的对象
		tableModel = new DefaultTableModel(tableValues, columnNames);
		// 创建指定表格模型的表格
		table = new JTable(tableModel);

		//设置 RowSorter(RowSorter 用于提供对 JTable 的排序和过滤)。
		table.setRowSorter(new TableRowSorter<DefaultTableModel>(tableModel));
		scrollPane.setViewportView(table);
		getContentPane().add(scrollPane, BorderLayout.CENTER);

		setBounds(300, 200, 400, 300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String args[]) {
		new JTableDemo1();
	}
}

截图1:


代码2:

import java.awt.*;
import javax.swing.*;

public class JTableDemo3 {

	JFrame frame;
	JPanel panel;
	JScrollPane scrollPane1, scrollPane2, scrollPane3;
	JTable jtable1, jtable2, jtable3;

	public JTableDemo3() {
		frame = new JFrame("JTableDemo");

		jtable1 = new JTable(8, 6);

		final Object[] columnNames = { "姓名", "性别", "家庭地址",// 列名最好用final修饰
				"电话号码", "生日", "工作", "收入", "婚姻状况", "恋爱状况" };
		Object[][] rowData = {
				{ "ddd", "男", "江苏南京", "1378313210", "03/24/1985", "学生", "寄生中",
						"未婚", "没" },
				{ "eee", "女", "江苏南京", "13645181705", "xx/xx/1985", "家教", "未知",
						"未婚", "好象没" },
				{ "fff", "男", "江苏南京", "13585331486", "12/08/1985", "汽车推销员",
						"不确定", "未婚", "有" },
				{ "ggg", "女", "江苏南京", "81513779", "xx/xx/1986", "宾馆服务员",
						"确定但未知", "未婚", "有" },
				{ "hhh", "男", "江苏南京", "13651545936", "xx/xx/1985", "学生", "流放中",
						"未婚", "无数次分手后没有" } };

		jtable2 = new JTable(rowData, columnNames);

		jtable3 = new JTable(rowData, columnNames);
		jtable3.setPreferredScrollableViewportSize(new Dimension(600, 100));// 设置表格的大小
		jtable3.setRowHeight(30);// 设置每行的高度为20
		jtable3.setRowHeight(0, 20);// 设置第1行的高度为15
		jtable3.setRowMargin(5);// 设置相邻两行单元格的距离
		jtable3.setRowSelectionAllowed(true);// 设置可否被选择.默认为false
		jtable3.setSelectionBackground(Color.white);// 设置所选择行的背景色
		jtable3.setSelectionForeground(Color.red);// 设置所选择行的前景色
		jtable3.setGridColor(Color.red);// 设置网格线的颜色
		jtable3.selectAll();// 选择所有行
		jtable3.setRowSelectionInterval(0, 2);// 设置初始的选择行,这里是1到3行都处于选择状态
		jtable3.clearSelection();// 取消选择
		jtable3.setDragEnabled(false);// 不懂这个
		jtable3.setShowGrid(true);// 是否显示网格线
		jtable3.setShowHorizontalLines(true);// 是否显示水平的网格线
		jtable3.setShowVerticalLines(true);// 是否显示垂直的网格线
		jtable3.setValueAt("tt", 0, 0);// 设置某个单元格的值,这个值是一个对象
		jtable3.doLayout();
		jtable3.setBackground(Color.cyan);

		// JTable最好加在JScrollPane上以实现滚动效果
		scrollPane1 = new JScrollPane(jtable1);
		scrollPane2 = new JScrollPane(jtable2);
		scrollPane3 = new JScrollPane(jtable3);

		panel = new JPanel(new GridLayout(0, 1));
		panel.setPreferredSize(new Dimension(600, 400));
		panel.setBackground(Color.black);
		panel.add(scrollPane1);
		panel.add(scrollPane2);
		panel.add(scrollPane3);

		frame.setContentPane(panel);
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new JTableDemo3();
	}
}
截图2:


二:树(JTree):

 1.基本概念:

  树(JTree):将分层数据集显示为轮廓的控件。

 2.常用构造方法:

   JTree():返回带有示例模型的JTree

   JTree(Object[] value):返回JTree,指定数组的每个元素作为不被显示的新根节点的子节点。

   //只有这个构造函数可以创建多个根结点
   JTree(Object[] value):返回 JTree,指定数组的每个元素作为不被显示的新根节点的子节点。

   JTree(TreeNode root):返回 JTree,指定的 TreeNode 作为其根,它显示根节点。

   JTree(TreeNode root, boolean asksAllowsChildren):返回 JTree,指定的 TreeNode 作为其根,
   它用指定的方式显示根节点,并确定节点是否为叶节点。(true设置为可添加孩子结点,再添加孩子结点).

 3.代码演示:

  示例1: 

public class JTreeDemo1 {
	
	JFrame f; 
	Box box;
	JTree jTree1,jTree2;
	
	public JTreeDemo1()
	{
		f = new JFrame(" JTreeDemo1 ");
		box = Box.createHorizontalBox(); //创建Box 类对象
		
		jTree1 = new JTree();
		jTree2 = new JTree();
		
		//向此组件添加任意的键/值
		jTree1.putClientProperty("JTree.lineStyle", "Angled"); 
		
		//向Box 容器添加滚动面板
		box.add(new JScrollPane(jTree1), BorderLayout.WEST);
		box.add(new JScrollPane(jTree2), BorderLayout.EAST);
		
        f.getContentPane().add(box, BorderLayout.CENTER);
        
		f.setSize(300, 240);
		//f.pack();
		f.setLocation(300, 200);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new JTreeDemo1();
	}
}

  截图1:

        

  示例2:

public class JTreeDemo2 {

	JFrame f; 
	JPanel p; 
	JTree jTree1,jTree2,jTree3,jTree4,jTree5,jTree6,jTree7;
	
	public JTreeDemo2() {
		
		f = new JFrame(" JTreeDemo2 ");
		
		// 构造函数:JTree()
		jTree1 = new JTree();
		
		// 构造函数:JTree(Object[] value)
		Object[] letters = { " a ", " b ", " c ", " d ", " e " };
		jTree2 = new JTree(letters);

		// 构造函数:JTree(TreeNode root)(TreeNode空)
		// 用空结点创建树
		DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(); // 定义树结点
		jTree3 = new JTree(node1); // 用此树结点做参数调用 JTree的构造函数创建含有一个根结点的树

		// 构造函数:JTree(TreeNode root)(同上,只是TreeNode非空)
		// 用一个根结点创建树
		DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(" Color ");
		jTree4 = new JTree(node2); // 结点不可以颜色,默认为白面黑字
		jTree4.setBackground(Color.lightGray);

		
		// 构造函数:JTree(TreeNode root, boolean
		// asksAllowsChildren)(同上,只是TreeNode又有不同)
		// 使用DefaultMutableTreeNode类先用一个根结点创建树,设置为可添加孩子结点,再添加孩子结点
		DefaultMutableTreeNode color = new DefaultMutableTreeNode(" Color ",
				true);
		
		DefaultMutableTreeNode gray = new DefaultMutableTreeNode(" Gray ");
		gray.add(new DefaultMutableTreeNode(" Lightgray "));
		gray.add(new DefaultMutableTreeNode(" Darkgray "));
		
		color.add(gray);
		
		color.add(new DefaultMutableTreeNode(" Red "));
		color.add(new DefaultMutableTreeNode(" Green "));

        jTree5 = new JTree(color);

        
		// 构造函数:JTree(TreeNode root)(同上,只是TreeNode非空)
		// 通过逐个添加结点创建树
		DefaultMutableTreeNode biology = new DefaultMutableTreeNode(" Biology ");
		DefaultMutableTreeNode animal = new DefaultMutableTreeNode(" Animal ");
		DefaultMutableTreeNode mammal = new DefaultMutableTreeNode(" Mammal ");
		DefaultMutableTreeNode horse = new DefaultMutableTreeNode(" Horse ");
		mammal.add(horse);
		animal.add(mammal);
		biology.add(animal);
		
		jTree6 = new JTree(biology);
		horse.isLeaf();
		horse.isRoot();

		
		// 构造函数:JTree(TreeModel newModel)
		// 用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义一个用DefaultTreeMode
		// 创建一个树的模型,再用JTree的构造函数创建一个树
		DefaultMutableTreeNode root = new DefaultMutableTreeNode(" Root1 ");
		DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(" Child1 ");
		DefaultMutableTreeNode child11 = new DefaultMutableTreeNode(" Child11 ");
		DefaultMutableTreeNode child111 = new DefaultMutableTreeNode(
				" Child111 ");
		root.add(child1);
		child1.add(child11);
		child11.add(child111);

		DefaultTreeModel model = new DefaultTreeModel(root);

		jTree7 = new JTree(model);

		
		p = new JPanel();
		p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
		p.setPreferredSize(new Dimension(700, 400));
		
		// JTree必须放在JScrollPane上
		p.add(new JScrollPane(jTree1)); 
		p.add(new JScrollPane(jTree2));
		p.add(new JScrollPane(jTree3));
		p.add(new JScrollPane(jTree4));
		p.add(new JScrollPane(jTree5));
		p.add(new JScrollPane(jTree6));
		p.add(new JScrollPane(jTree7));

		
		f.setContentPane(p);
		f.pack();
		f.setLocation(300, 200);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		
		new JTreeDemo2();
	
	}
}

  截图2:

      






  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目录 目录 1 (一) Spring 开发 Swing GUI 简介——依赖注入和富客户机 5 关于本教程 5 前提条件 6 Spring 和依赖注入概述 7 什么是 Spring 框架? 7 什么是依赖注入? 7 环境设置 7 选择编译环境 7 设置 Ant 8 通过 Ant 自动下载依赖软件 10 设置 Maven 10 通过 Maven 自动下载依赖软件 12 设置 Eclipse 13 下载依赖的 JAR 文件并在 Eclipse 的 classpath 中定义这种依赖性 15 创建 to-do 列表:基本的 Swing 和 Spring 应用程序设置 17 创建 MainFrame、Launcher 和 ToDo 类 17 创建 Spring app-context.xml bean 定义文件 19 运行应用程序 20 定义 bean 属性 21 创建 to-do 列表:创建一个可重用组件并在表中显示数据 23 创建一个可重用的面板 23 将 bean 组合在一起 24 添加一个表并重用这个面板 26 定义表模型 28 显示列表中的项 29 创建 to-do 列表:完成 —— 按钮和监听程序 31 创建按钮和监听程序 32 组合按钮和监听程序 35 Spring Rich Client Project 37 Spring Rich Client Project 概述 37 结束语 38 (二) 适用于各类Swing应用的通用数据验证模块 39 项目创建好后,加入类库: 41 然后写一个persistence bean: 41 Java代码 41 我称这个类为HibernateValidationUI,代码如下: 43 Java代码 43 类中用到的Java2DIconFactory代码如下: 47 Java代码 47 Factory类 49 Java代码 49 最后,我们可以编写一个Demo application来看看效果如何,代码如下: 51 Java代码 51 总结: 55 (三) 对JTree从创建到使用详解 56 (四) JTree使用方法 57 JTreeDemo.java源程序 57 经验汇总 60 1. 初始化 60 2. 三个经常使用的取值函数 60 3. 根据node得到path: 60 4. 根据Path展开到该节点 60 5. 根据path设定该节点选定 61 6. 选中节点的方法 61 7. 滚动到可见位置 61 8. 给JTree添加右键弹出菜单 61 9. 关于JTree的展开 61 10. 如何遍历JTree 62 (五) JTree右键菜单实现编辑、添加、删除节点 63 Test.java源代码 63 (六) 功能齐全的JTree例子 66 TreeEditTest.java源代码 66 (七) JTree控件的使用 70 构造函数: 70 TreeModel接口 70 DefaultTreeModel缺省版本 71 TreeNode接口 71 TreeExpansionListener接口 71 TreeCellRenderer 72 例子: 73 (八) 如何为JTree添加右键菜单? 75 (九) 如何使JTextArea随着窗体的变化自动调整大小 76 TextAreaTest源代码 76 (十) JAVA swing编程JTree实现系统目录 77 FileTree1.java源代码 77 (十一) Java Swing中的JTree模型 85 Swing.tree包中的主要类名称实现 85 1. 构建模型 86 2. 结点 86 结构详细类图 86 2.1 TreeNode接口 86 2.2 MutableTreeNode接口 87 2.3 DefaultMutableTreeNode类 88 3. 编辑 88 3.1获得结点路径 88 3.2编辑结点 88 3.3视图显示 89 4. 查找 89 5. 绘制结点 90 (十二) JTree鼠标左键的双击事件选用那个监听器 91 MouseDemo.java源代码 92 (十三) JTree 92 JTree的构造函数: 93 JTreeDefaultDemo.java源代码 93 (十四) JTree 应用 96 Frame1.java源代码 96 MyDefaultTreeCellRenderer.java源代码 98 (十五) JTree控件 100 和节点的基本概念 100 有关JTree的类和接口 100 代码实例:构建一棵 101 相关语句解释 101 (十六) JTree应用示例——文件路径 103 AnimatedIconTreeExample.java源代码 103 //内部类NodeImageObserver.java源代码 105 //IconNodeRenderer.java源代码 106 //IconNode.java源代码 107 (十七) Swing 学习笔记 108 Swing API 包括18个公共包: 108 例程1.1 HelloWorldSwing.java 109 例程2.2 HelloWorldJFrame.java 110 (十八) 动态加载文件的java程序 111 FileSystemTree.java源代码 112 //内部类 TreeWillExpandListenerImp.java 114 (十九) 向 Java 应用程序伸出援助之手——用 JavaHelp 2.0 构建下一个 Java 应用程序的帮助系统 115 入门 116 使用 HelpSet 117 HelpSet 数据文件 118 helpset 文件 118 maps 部分 119 view 部分 119 presentation 部分 120 implementation 部分 121 map 文件 121 导航文件 121 TOC 122 Index 122 Glossary 123 Favorites 123 主题文件 123 在 Java 应用程序中调用 JavaHelp 124 自定义外观 125 配置图标 125 基于文字的标签还是基于图像的标签? 125 要工具栏还是不要工具栏? 125 设置字体 126 使用展示窗口 127 <object> 标签 128 四种 activator 129 添加内容敏感的帮助 130 窗口级帮助 131 字段级帮助 131 屏幕级帮助 133 添加嵌入帮助 135 添加搜索功能 136 停用词 137 自定义停用词列表 137 合并 helpset 138 静态和动态合并 139 添加轻量级组件 141 基于服务器的帮助 144 设置 144 JavaHelp 服务器 bean 144 JavaScript 文件 145 JSP 文件 145 测试服务器端帮助 148 结束语 149
JTable 是 Java Swing 中的一个组件,用于显示表格数据。如果需要在 JTable 中显示形结构的数据,可以通过使用 JTreeJTable 的组合来实现。 实现步骤如下: 1. 创建一个 JTree 对象来表示形结构的数据。 2. 创建一个 DefaultTableModel 对象作为 JTable 的数据模型。 3. 将 JTable 的数据模型设置为一个可编辑的 TreeTableModel,其中 TreeTableModel 是一个自定义的接口,继承了 TableModel 和 TreeModel 接口。 4. 将 JTableJTree 进行组合,使得 JTable 中每一行的第一列是一个可展开/折叠的形节点。 以下是一个简单的示例代码: ```java import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTree; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; public class JTableTreeDemo extends JFrame { private static final long serialVersionUID = 1L; public JTableTreeDemo() { super("JTableTreeDemo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建形结构的数据 DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Node1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Node2"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("Node3"); root.add(node1); root.add(node2); node2.add(node3); JTree tree = new JTree(root); // 创建 JTable 的数据模型 DefaultTableModel model = new DefaultTableModel(new Object[][] { { "Node1", "Value1" }, { "Node2", "Value2" }, { "Node3", "Value3" }, }, new String[] { "Name", "Value" }); // 创建 TreeTableModel 对象,将 JTable 的数据模型设置为可编辑的 TreeTableModel TreeTableModel treeTableModel = new TreeTableModel(tree.getModel(), model); JTable table = new JTable(treeTableModel); // 设置 JTable 中第一列为形结构 table.getColumnModel().getColumn(0).setCellRenderer(new TreeTableCellRenderer()); table.setPreferredScrollableViewportSize(new Dimension(300, 200)); // 监听形结构的变化,更新 JTable 的数据模型 tree.getModel().addTreeModelListener(new TreeModelListener() { @Override public void treeStructureChanged(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } @Override public void treeNodesRemoved(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } @Override public void treeNodesInserted(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } @Override public void treeNodesChanged(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } }); // 将 JTableJTree 进行组合 JScrollPane scrollPane = new JScrollPane(table); scrollPane.setRowHeaderView(tree); getContentPane().add(scrollPane, BorderLayout.CENTER); pack(); setLocationRelativeTo(null); } public static void main(String[] args) { JTableTreeDemo demo = new JTableTreeDemo(); demo.setVisible(true); } // TreeTableModel 接口的实现 private static class TreeTableModel implements TableModel, TreeModel { private TreeModel treeModel; private TableModel tableModel; public TreeTableModel(TreeModel treeModel, TableModel tableModel) { this.treeModel = treeModel; this.tableModel = tableModel; } public void setTreeModel(TreeModel treeModel) { this.treeModel = treeModel; } @Override public int getRowCount() { return tableModel.getRowCount(); } @Override public int getColumnCount() { return tableModel.getColumnCount(); } @Override public String getColumnName(int columnIndex) { return tableModel.getColumnName(columnIndex); } @Override public Class<?> getColumnClass(int columnIndex) { return tableModel.getColumnClass(columnIndex); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return tableModel.isCellEditable(rowIndex, columnIndex); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return tableModel.getValueAt(rowIndex, columnIndex); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { tableModel.setValueAt(aValue, rowIndex, columnIndex); } @Override public void addTableModelListener(TableModelListener l) { tableModel.addTableModelListener(l); } @Override public void removeTableModelListener(TableModelListener l) { tableModel.removeTableModelListener(l); } @Override public Object getRoot() { return treeModel.getRoot(); } @Override public Object getChild(Object parent, int index) { return treeModel.getChild(parent, index); } @Override public int getChildCount(Object parent) { return treeModel.getChildCount(parent); } @Override public boolean isLeaf(Object node) { return treeModel.isLeaf(node); } @Override public void valueForPathChanged(TreePath path, Object newValue) { treeModel.valueForPathChanged(path, newValue); } @Override public int getIndexOfChild(Object parent, Object child) { return treeModel.getIndexOfChild(parent, child); } @Override public void addTreeModelListener(TreeModelListener l) { treeModel.addTreeModelListener(l); } @Override public void removeTreeModelListener(TreeModelListener l) { treeModel.removeTreeModelListener(l); } } // 自定义的 TableCellRenderer,用于显示形结构的数据 private static class TreeTableCellRenderer extends JTree implements javax.swing.table.TableCellRenderer { private static final long serialVersionUID = 1L; private int visibleRow; public TreeTableCellRenderer() { setRootVisible(false); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } visibleRow = row; return this; } @Override public Dimension getPreferredSize() { Dimension preferredSize = super.getPreferredSize(); if (visibleRow >= 0) { preferredSize.width = getParent().getWidth(); } return preferredSize; } } } ``` 运行该示例代码,可以看到一个包含形结构的 JTable

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值