java swing表格和树
- 格式:ppt
- 大小:804.50 KB
- 文档页数:26
java中jtable的用法一、JTable简介JTable是Java Swing包中的一个组件,用于在图形用户界面(GUI)中显示和编辑表格数据。
它可以显示任何类型的数据,包括文本、数字、日期和图像等。
二、创建JTable1. 创建一个空的JTable可以通过以下代码创建一个空的JTable:```JTable table = new JTable();```2. 从二维数组创建JTable可以通过以下代码从二维数组创建一个简单的JTable:String[][] data = {{"John", "Doe"}, {"Jane", "Doe"}};String[] columnNames = {"First Name", "Last Name"};JTable table = new JTable(data, columnNames);```3. 从TableModel创建JTable可以通过实现TableModel接口并使用它来创建一个定制的TableModel,然后将其传递给JTable构造函数来创建一个自定义的JTable。
4. 从数据库中获取数据并创建JTable可以通过使用Java数据库连接(JDBC)API与数据库进行交互,并将结果集转换为TableModel,然后将其传递给JTable构造函数来从数据库中获取数据并创建一个自定义的JTable。
三、设置表格属性1. 设置表头可以使用以下代码设置表头:```String[] columnNames = {"First Name", "Last Name"};table.setColumnIdentifiers(columnNames);```2. 设置表格行高和列宽可以使用以下代码设置表格行高和列宽:```table.setRowHeight(30);table.getColumnModel().getColumn(0).setPreferredWidth(100); ```3. 设置表格背景色和前景色可以使用以下代码设置表格背景色和前景色:```table.setBackground(Color.white);table.setForeground(Color.black);```4. 设置表格字体可以使用以下代码设置表格字体:```Font font = new Font("Arial", Font.PLAIN, 14);table.setFont(font);```5. 设置表格边框可以使用以下代码设置表格边框:```Border border = BorderFactory.createLineBorder(Color.black); table.setBorder(border);```四、渲染器和编辑器1. 渲染器渲染器用于将单元格中的值呈现为用户界面上的文本或图像。
如何使用Table利用JTable 类,可以以表格的形式展示数据,可设置允许用户编辑数据。
JT able 本身不拥有或者缓存数据;它只是数据的视图。
这里有一个放在滚动面板上的典型表格:本文展示如何完成一些常见的表格相关的任务:包括以下部分:(1)创建一个简单的表格(2)向容器添加表格(3)改变每每一栏的宽度(4)用户选择(5)创建表格模型(6)监听数据改变(7)点燃数据改变事件(8)概念:编辑器和渲染器(9)使用自定义渲染器(10)为单元格指定提示工具(11)为列头指定提示工具(12)排序和过滤(13)使用组合框作为编辑器(14)使用其他编辑器(15)使用编辑器验证用户的文本输入(16)打印(17)例子列表(1)创建一个简单的表格SimpleTableDemo.java中的表格在一个字符串数组中声明各个列名Java代码1String[] columnNames = {"First Name",2"Last Name",3"Sport",4"# of Years",5"Vegetarian"};数据初始化并存储在二维数组:Java代码6Object[][] data = {7 {"Kathy", "Smith",8"Snowboarding", new Integer(5), new Boolean(false)},9 {"John", "Doe",10"Rowing", new Integer(3), new Boolean(true)},11 {"Sue", "Black",12"Knitting", new Integer(2), new Boolean(false)},13 {"Jane", "White",14"Speed reading", new Integer(20), new Boolean(true)},15 {"Joe", "Brown",1617"Pool", new Integer(10), new Boolean(false)}18};接着表格使用这些数据和列名构造一个表格:Java代码19JTable table = new JTable(data, columnNames);有两个接收数据的JT able 构造器:∙JTable(Object[][] rowData, Object[] columnNames)∙JTable(Vector rowData, Vector columNames)这些构造函数的好处是容易实现,而缺点是:∙他们自动设置每个单元格为可编辑∙数据类型都视为一样的(字符串类型)。
JavaSwing介绍Swing 是⼀个为Java设计的GUI⼯具包。
Swing是JAVA基础类的⼀部分。
Swing包括了图形⽤户界⾯(GUI)器件如:⽂本框,按钮,分隔窗格和表。
Swing提供许多⽐AWT更好的屏幕显⽰元素。
它们⽤纯Java写成,所以同Java本⾝⼀样可以跨平台运⾏,这⼀点不像AWT。
它们是JFC的⼀部分。
它们⽀持可更换的⾯板和主题(各种操作系统默认的特有主题),然⽽不是真的使⽤原⽣平台提供的设备,⽽是仅仅在表⾯上模仿它们。
这意味着你可以在任意平台上使⽤JAVA⽀持的任意⾯板。
轻量级组件的缺点则是执⾏速度较慢,优点就是可以在所有平台上采⽤统⼀的⾏为。
Hello World 程序HelloWorldSwing.java ⽂件代码如下:1import javax.swing.*;2public class HelloWorldSwing {3/**{4 * 创建并显⽰GUI。
出于线程安全的考虑,5 * 这个⽅法在事件调⽤线程中调⽤。
6*/7private static void createAndShowGUI() {8// 确保⼀个漂亮的外观风格9 JFrame.setDefaultLookAndFeelDecorated(true);1011// 创建及设置窗⼝12 JFrame frame = new JFrame("HelloWorldSwing");13 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);1415// 添加 "Hello World" 标签16 JLabel label = new JLabel("Hello World");17 frame.getContentPane().add(label);1819// 显⽰窗⼝20 frame.pack();21 frame.setVisible(true);22 }2324public static void main(String[] args) {25// 显⽰应⽤ GUI26 javax.swing.SwingUtilities.invokeLater(new Runnable() {27public void run() {28 createAndShowGUI();29 }30 });31 }32 }执⾏以下命令输出结果:$ javac HelloWorldSwing.java$ java HelloWorldSwing⼀个⽤户登录框实例SwingLoginExample.java ⽂件代码如下:1import javax.swing.JButton;2import javax.swing.JFrame;3import javax.swing.JLabel;4import javax.swing.JPanel;5import javax.swing.JPasswordField;6import javax.swing.JTextField;7public class SwingLoginExample {89public static void main(String[] args) {10// 创建 JFrame 实例11 JFrame frame = new JFrame("Login Example");12// Setting the width and height of frame13 frame.setSize(350, 200);14 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);1516/* 创建⾯板,这个类似于 HTML 的 div 标签17 * 我们可以创建多个⾯板并在 JFrame 中指定位置18 * ⾯板中我们可以添加⽂本字段,按钮及其他组件。
Swing 甚至走得更远一步,在基本的UI 原则之上又放上了一个公共的设计模式。
这个设计模式叫做模型-视图-控制器(Model-View-Controller,MVC),它试图“把角色分开”。
MVC 让负责显示的代码、处理数据的代码、对交互进行响应并驱动变化的代码彼此分离。
JComponentSwing 的整个可视组件库的基础构造块是JComponent。
它是所有组件的父类。
它是一个抽象类,所以不能创建JComponent,但是作为类层次结构的结果,从字面意义来说它包含了数百个函数,Swing 中的每个组件都可以使用这些函数。
显然,有些概念要比其他概念重要,所以对于本教程,需要学习的重要的东西是:∙JComponent 不仅是Swing 组件的基类,还是定制组件的基类(有关的更多信息在“中级Swing”教程中)。
∙它为所有组件提供了绘制的基础架构——一些方便进行组件定制的东西(同样,在“中级Swing”中,有关于这个主题的更多信息)。
∙它知道如何处理所有的键盘按键。
所以类只需要侦听特定的键。
∙它包含add() 方法,可以添加其他JComponent。
换种方式来看,可以把任意Swing 组件添加到其他任何Swing 组件,从而构造嵌套组件(例如,JPanel 包含JButton,甚至包含一些古怪的组合,例如JMenu 包含JButton)。
简单的swing小部件Swing 库中最基础的组件是JLabel。
它所做的正是您所期望的:呆在那儿,看起来很漂亮,描述其他组件。
下图显示了的JLabel 实际应用:JLabel不太吸引人,但是仍然有用。
实际上,在整个应用程序中,不仅把JLabel 用作文本描述,还将它用作图片描述。
每当在Swing 应用程序中看到图片的时候,它就有可能是JLabel。
JLabel 对于Swing 初学者来说没有许多意料之外的方法。
基本的方法包括设置文本、图片、对齐以及标签描述的其他组件:∙get/setText():获取/设置标签的文本。
Java Swing中的JTree模型本文介绍Java Swing中的JTree模型,介绍如何创建、修改、遍历,设置树。
参考Core Java2相关章节及其源代码。
Swing树使用人们所熟悉的文件夹和树叶图来显示分层的数据。
树由节点组成,节点可以是文件夹,也可以是树叶。
文件夹可以有子节点,除根节点之外的所有节点都只有一个父节点。
空的文件夹与树叶的不同之处就在于它允许有子节点。
除父节点和子节点外,树的节点还有一个用户对象(当使用DefaultTreeModel时就会呈现一个用户对象)。
用户对象是Object类型,因此它提供了一个将任意对象与节点相关联的办法。
树有一个简单的模型,每一个JTree实例都要维护对绘制器和编辑器的引用,这个绘制器和编辑器被树中所有的节点所使用。
表1中列出了swing.tree包中的主要类。
表1 Swing.tree包中的主要类名称实现DefaultMutableTreeNode 一个具有一个父节点、(可能)许多子节点和一个用户对象的可变节点,为相关联的节点提供了访问方法。
如果没有任何子节点,这个节点就是树叶。
DefaultTreeModel 一个激发TreeModel Events事件的简单可变的模型。
提供对子节点的访问方法,但不是提供对父节点的访问方法。
DefaultTreeCellEditor 绘制器和编辑器的包装器,它把一个“真正”的编辑器组件放在节点图标的旁边。
DefaultTreeCellRenderer 具有字体、颜色和图标访问方法的JLabel扩展,它提供图标的缺省值。
TreePath 由一个节点到另一个节点的路径。
路径中的节点存储在一个数组中。
路径用于在选取内容之间进行通信。
1.构建树模型详细代码见SimpleTree.javaDefaultMutableTreeNode root = new DefaultMutableTreeNode("World"); DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");root.add(country);。
swing jxtreetable用法Swing JXTreeTable是基于Java Swing的扩展组件,提供了一个带有树形结构的表格控件。
JXTreeTable具有JTable的所有功能以及额外的树形结构功能,可以同时展示表格和树状结构的数据。
本文将详细介绍JXTreeTable的用法,包括创建和初始化、添加数据、自定义表格和树状结构、以及其他常用操作等。
1. 创建和初始化JXTreeTable首先,创建一个JXTreeTable实例需要导入相应的包和类。
JXTreeTable位于swingx包中,可通过以下代码导入:import org.jdesktop.swingx.JXTreeTable;然后,可以通过构造函数创建JXTreeTable实例:JXTreeTable treeTable = new JXTreeTable();如果需要传递表格数据模型和树状结构数据模型,可以使用以下构造函数:TreeTableModel treeT ableModel = new MyTreeTableModel(root); 自定义树状结构数据模型TableModel tableModel = new DefaultTableModel(data, columnNames); 表格数据模型JXTreeTable treeTable = new JXTreeTable(treeTableModel, tableModel);在创建JXTreeTable实例后,可以通过以下代码设置表格的可见行数和列数:treeTable.setVisibleRowCount(10); 可见行数为10treeTable.setVisibleColumnCount(5); 可见列数为52. 添加数据添加数据到JXTreeTable可以使用默认的TableModel类或者自定义的TableModel类。
如果使用默认的TableModel类,可以使用以下代码添加行数据:DefaultTableModel model = (DefaultTableModel)treeTable.getTableModel();model.addRow(new Object[] { "Data 1", "Data 2", "Data 3" });如果需要添加树状结构的数据,可以使用以下代码:TreeTableModel treeModel = (TreeTableModel)treeTable.getTreeTableModel();treeModel.insertNodeInto(node, parent, index);其中,node是要插入的节点,parent是父节点,index是要插入的位置。
在Java1.0中,已经有一个用于GUI编程的类库AWT(Abstract Window Toolkit),称之为抽象窗口工具箱。
遗憾的是,AWT中的组件(例如按钮,类名为Button)在实现中使用了本地代码(Native Code),这些组件的创建和行为是由应用程序所在平台上的本地GUI工具来处理的。
因此,AWT组件要在不同的平台上提供给用户一致的行为就受到了很大的限制。
同时,AWT组件中还存在很多bug,这就使得使用AWT来开发跨平台的GUI应用程序困难重重。
1996年,SUN公司和Netsacpe公司在一个称为Swing的项目中合作完善了Netsacpe公司原来开发的一套GUI库,也就是现在所谓的Swing组件。
Swing组件和原来的AWT组件完全不同,最大的区别就是Swing组件的实现中没有使用本地代码,这样对底层平台的依赖型就大为降低,并且可以给不同平台的用户一致的感觉。
此外,和原来的AWT相比,Swing 中提供了内容更多、使用更为方便的组件。
在阅读一些书籍时,常会遇到名词JFC(Java Foundation Class)。
JFC的概念是在1997年的JavaOne开发者大会上首次提出的,是指用于构建GUI的一组API。
实际上,Swing只是JFC的一部分,其它的还有二维图形(Java 2D)API以及拖放(Drag and Drop)API等等。
Swing并不是完全取代了AWT,Swing只是使用更好的GUI组件(如JButton)代替AWT 中相应的GUI组件(如Button),并且增加了一些AWT中原来所没有的GUI组件。
并且,Swing 仍使用AWT 1.1的事件处理模型。
虽然现在AWT组件仍得到支持,但是建议在你的应用程序中尽量使用Swing组件和1.1的事件模型。
1.标签(JLabel)标签(JLabel)通常是用来标识另外一个组件的含义。
以在标签上显示文字、图象或是文字图象的组合。
Swing-JTable⽤法-⼊门注:本⽂为学习笔记,原⽂为,本⽂所有素材与代码均源于原⽂,可能会有部分更改。
JTable是Swing中的表格控件,它的外观如下所⽰:没错,excel或者access数据库的编辑区就是JTable这样的控件了。
创建JTableJTable提供了2个构造器可以让你⽤数据和头部直接⽣成它:JTable(Object[][] rowData, Object[] columnNames)JTable(Vector rowData, Vector columnNames)这两个构造器有⼀些特性你必须要注意:1.JTable所有的单元格都是可编辑的;2.它将所有数据都当做string来处理。
本来,JTable可以将布尔型数据⽤⼀个checkBox来进⾏展⽰,就像表1那样,在这⾥就不⾏了。
3.它要求你把所有数据都放到数组或vector中。
如果你的数据来⾃于数据库,那么专门再填充到数组实在是多此⼀举。
呐,如果你不能忍受以上限制,那么就使⽤table Model来管理你的数据吧!创建TableModel如果程序没有显式地指定tableModel,JTable会⾃动⽣成⼀个实例,这样做的副作⽤在上⾯已经说过了。
我们⾃⼰创建tableModel可以让数据得到更好的展⽰,这样做的⽅法是继承。
它已经提供了tableModel接⼝的⼤部分默认实现,在最低限度下,你只需要实现以下三个⽅法:public int getRowCount();public int getColumnCount();public Object getValueAt(int row, int column);当然,如果你的应⽤程序有其他定制化的功能,你可以⾃⼰实现的其它⽅法,⽐如:public Class getColumnClass(int c)//JTable uses this method to determine the default renderer editor for each cellpublic boolean isCellEditable(int row, int col)//Don't need to implement this method unless your table's editablepublic void setValueAt(Object value, int row, int col) //Don't need to implement this method unless your table's data can change.⽰意了如何⾃⼰创建并使⽤tableModel。
表格分页package com.llt.demo;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Vector;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.UIManager;import javax.swing.border.EmptyBorder;import javax.swing.table.DefaultTableModel;import javax.swing.table.JTableHeader;public class PageTable extends JFrame {/*** 刘力天*/private static final long serialVersionUID = 1698867170940729036L;//容器private JPanel contentPane;//表格private JTable table;//按钮首页private JButton firstPageButton;//前一页private JButton latePageButton;//下一页private JButton nextPageButton;//末页private JButton lastPageButton;//private int maxPageNumber;private int currentPageNumber = 1;private double pageSize = 5;private DefaultTableModel defaultModel;/*** Launch the application.*/public static void main(String[] args) {try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );} catch (Throwable e) {e.printStackTrace();}EventQueue.invokeLater(new Runnable() {public void run() {try {PageTable frame = new PageTable();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}public PageTable() {addWindowListener(new WindowAdapter() {@Overridepublic void windowActivated(WindowEvent e) {do_this_windowActivated(e);}});//标题setTitle("表格的分页");//关闭setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//大小及位置setBounds(100, 100, 450, 300);//容器contentPane = new JPanel();//容器边框contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));//容器布局contentPane.setLayout(new BorderLayout(0, 0));setContentPane(contentPane);//面板JPanel panel = new JPanel();//添加面板contentPane.add(panel, BorderLayout.SOUTH);//首页firstPageButton = new JButton("首页");//为首页添加事件firstPageButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {do_firstPageButton_actionPerformed(e);}});//首页字体firstPageButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); //添加首页panel.add(firstPageButton);//前一页latePageButton = new JButton("前一页");//为前一页添加事件latePageButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {do_latePageButton_actionPerformed(e);}});//前一页设置字体latePageButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); //添加前一页panel.add(latePageButton);//下一页nextPageButton = new JButton("下一页");//为下一页添加事件nextPageButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {do_nextPageButton_actionPerformed(e);}});//为下一页设置字体nextPageButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); //添加下一页panel.add(nextPageButton);//末页lastPageButton = new JButton("末页");lastPageButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_lastPageButton_actionPerformed(e);}});//末页设置字体lastPageButton.setFont(new Font("微软雅黑", Font.PLAIN, 14));//添加末页panel.add(lastPageButton);//滚动条JScrollPane scrollPane = new JScrollPane();//添加滚动条contentPane.add(scrollPane, BorderLayout.CENTER);//表格table = new JTable();//表格字体table.setFont(new Font("微软雅黑", Font.PLAIN, 14));//表格行高table.setRowHeight(35);//表头JTableHeader header = table.getTableHeader();//表头设置字体header.setFont(new Font("微软雅黑", Font.PLAIN, 16));//设置表头高度header.setPreferredSize(new Dimension(header.getWidth(), 40));//表格添加滚动条scrollPane.setViewportView(table);}//窗体加载时protected void do_this_windowActivated(WindowEvent e) {//表格模型defaultModel = (DefaultTableModel) table.getModel();//defaultModel.setRowCount(0);defaultModel.setColumnIdentifiers(new Object[] { "序号", "平方数" });for (int i = 0; i < 23; i++) {defaultModel.addRow(new Object[] { i, i * i });}maxPageNumber = (int) Math.ceil(defaultModel.getRowCount() / pageSize);table.setModel(defaultModel);firstPageButton.setEnabled(false);latePageButton.setEnabled(false);nextPageButton.setEnabled(true);lastPageButton.setEnabled(true);}@SuppressWarnings("unchecked")//首页事件protected void do_firstPageButton_actionPerformed(ActionEvent e) { //初始页currentPageNumber = 1;//得到集合Vector dataVector = defaultModel.getDataVector();//模型DefaultTableModel newModel = new DefaultTableModel();newModel.setColumnIdentifiers(new Object[] { "序号", "随机数" });for (int i = 0; i < pageSize; i++) {newModel.addRow((Vector) dataVector.elementAt(i));}table.setModel(newModel);firstPageButton.setEnabled(false);latePageButton.setEnabled(false);nextPageButton.setEnabled(true);lastPageButton.setEnabled(true);}@SuppressWarnings("unchecked")//下一页事件protected void do_latePageButton_actionPerformed(ActionEvent e) { currentPageNumber--;Vector dataVector = defaultModel.getDataVector();DefaultTableModel newModel = new DefaultTableModel();newModel.setColumnIdentifiers(new Object[] { "序号", "随机数" });for (int i = 0; i < pageSize; i++) {newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (currentPageNumber - 1) + i)));}table.setModel(newModel);if (currentPageNumber == 1) {firstPageButton.setEnabled(false);latePageButton.setEnabled(false);}nextPageButton.setEnabled(true);lastPageButton.setEnabled(true);}@SuppressWarnings("unchecked")//前一页protected void do_nextPageButton_actionPerformed(ActionEvent e) { currentPageNumber++;Vector dataVector = defaultModel.getDataVector();DefaultTableModel newModel = new DefaultTableModel();newModel.setColumnIdentifiers(new Object[] { "序号", "平方数" });if (currentPageNumber == maxPageNumber) {int lastPageSize = (int) (defaultModel.getRowCount() - pageSize * (maxPageNumber - 1));for (int i = 0; i < lastPageSize; i++) {newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (maxPageNumber - 1) + i)));}nextPageButton.setEnabled(false);lastPageButton.setEnabled(false);} else {for (int i = 0; i < pageSize; i++) {newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (currentPageNumber - 1) + i)));}}table.setModel(newModel);firstPageButton.setEnabled(true);latePageButton.setEnabled(true);}@SuppressWarnings("unchecked")//下一页protected void do_lastPageButton_actionPerformed(ActionEvent e) {currentPageNumber = maxPageNumber;Vector dataVector = defaultModel.getDataVector();DefaultTableModel newModel = new DefaultTableModel();newModel.setColumnIdentifiers(new Object[] { "序号", "平方数" });int lastPageSize = (int) (defaultModel.getRowCount() - pageSize * (maxPageNumber - 1));if (lastPageSize == 5) {for (int i = 0; i < pageSize; i++) {newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (maxPageNumber - 1) + i)));}} else {for (int i = 0; i < lastPageSize; i++) {newModel.addRow((Vector) dataVector.elementAt((int) (pageSize * (maxPageNumber - 1) + i)));}}table.setModel(newModel);firstPageButton.setEnabled(true);latePageButton.setEnabled(true);nextPageButton.setEnabled(false);lastPageButton.setEnabled(false);}}。