背景
项目应用中有不少场景需要各种Swing组件,特此整理!
问题
Java Swing中JTable组件如何构建?
说明
JTable这类的显示组件一般都会与JScrollPane组件组合出现,要不然数据项不会有滚动条。
样例Demo
下面总共有两个Demo,第一个是基础的渲染Demo
Demo1
下面的Demo是一则没有滚动条的Table样例:
package com.company.swing.table.demo1; import javax.swing.*; import java.awt.*; /** * 用例主要演示基础表格数据的生成, */ public class Table1 { public static void main(String[] args) { // 初始化一个数据面板用来装载数据。这里的布局方式使用对于表格类Dom渲染最友好的边界布局。 // (如果使用其他的布局方式也可以实现数据的正常渲染,但是需要进行样式的调配,因此此类Dom数据的渲染使用边界布局性价比最高) JPanel panel = new JPanel(new BorderLayout()); // 初始化数据表头 Object[] columnNames = {"姓名", "语文", "数学", "英语", "总分"}; // 初始化数据行(二维数组) Object[][] rowData = { {"张三", 80, 80, 80, 240}, {"John", 70, 80, 90, 240}, {"Sue", 70, 70, 70, 210}, {"Jane", 80, 70, 60, 210}, {"Joe", 80, 70, 60, 210} }; // 利用表格组件JTable进行数据组装。这里组装的目的是将基础的数据结构组装成显示组件能够渲染的数据格式。 JTable table = new JTable(rowData, columnNames); // 上面组装完的数据table默认返回的时table的数据行,没有对应的数据表头。但是之前组装了对应的表头,此时表头数据已经转换成了显示组件能够支持渲染的格式。 // 这里就可以直接获取表头数据首先进行渲染。 panel.add(table.getTableHeader(), BorderLayout.NORTH); // 这里把表格数据进行渲染。 panel.add(table, BorderLayout.CENTER); JFrame jFrame = new JFrame("测试窗口"); jFrame.setContentPane(panel); jFrame.pack(); jFrame.setVisible(true); jFrame.setLocationRelativeTo(null); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } }
效果图
Demo2
下面的Demo是一则拥有滚动条的Table样例:
package com.company.swing.table.demo1; import javax.swing.*; import java.awt.*; public class Table2 { public static void main(String[] args) { // 初始化一个数据面板用来装载数据。这里的布局方式使用对于表格类Dom渲染最友好的边界布局。 // (如果使用其他的布局方式也可以实现数据的正常渲染,但是需要进行样式的调配,因此此类Dom数据的渲染使用边界布局性价比最高) JPanel panel = new JPanel(new BorderLayout()); // 初始化数据表头 Object[] columnNames = {"姓名", "语文", "数学", "英语", "总分"}; // 初始化数据行(二维数组) Object[][] rowData = { {1, "张三", 80, 80, 80, 240}, {2, "John", 70, 80, 90, 240}, {3, "Sue", 70, 70, 70, 210}, {4, "Jane", 80, 70, 60, 210}, {5, "Joe_05", 80, 70, 60, 210}, {6, "Joe_06", 80, 70, 60, 210}, {7, "Joe_07", 80, 70, 60, 210}, {8, "Joe_08", 80, 70, 60, 210}, {9, "Joe_09", 80, 70, 60, 210}, {10, "Joe_10", 80, 70, 60, 210}, {11, "Joe_11", 80, 70, 60, 210}, {12, "Joe_12", 80, 70, 60, 210}, {13, "Joe_13", 80, 70, 60, 210}, {14, "Joe_14", 80, 70, 60, 210}, {15, "Joe_15", 80, 70, 60, 210}, {16, "Joe_16", 80, 70, 60, 210}, {17, "Joe_17", 80, 70, 60, 210}, {18, "Joe_18", 80, 70, 60, 210}, {19, "Joe_19", 80, 70, 60, 210}, {20, "Joe_20", 80, 70, 60, 210} }; // 利用表格组件JTable进行数据组装。这里组装的目的是将基础的数据结构组装成显示组件能够渲染的数据格式。 JTable table = new JTable(rowData, columnNames); { // 设置表格内容颜色 table.setForeground(Color.BLACK); // 字体颜色 table.setFont(new Font(null, Font.PLAIN, 14)); // 字体样式 table.setSelectionForeground(Color.DARK_GRAY); // 选中后字体颜色 table.setSelectionBackground(Color.LIGHT_GRAY); // 选中后字体背景 table.setGridColor(Color.GRAY); // 网格颜色 // 设置表头 table.getTableHeader().setFont(new Font(null, Font.BOLD, 14)); // 设置表头名称字体样式 table.getTableHeader().setForeground(Color.RED); // 设置表头名称字体颜色 table.getTableHeader().setResizingAllowed(false); // 设置不允许手动改变列宽 table.getTableHeader().setReorderingAllowed(false); // 设置不允许拖动重新排序各列 // 设置行高 table.setRowHeight(30); // 第一列列宽设置为40 table.getColumnModel().getColumn(0).setPreferredWidth(40); // 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到) table.setPreferredScrollableViewportSize(new Dimension(400, 300)); // 把 表格 放到 滚动面板 中(表头将自动添加到滚动面板顶部) JScrollPane scrollPane = new JScrollPane(table); // 添加 滚动面板 到 内容面板 panel.add(scrollPane); } { // JTable一边都会与JScrollPane组件成对出现,这类的显示组件都是需要滚动条来查看更多的数据。因此一般不会没有JScrollPane的加持。 // // 上面组装完的数据table默认返回的时table的数据行,没有对应的数据表头。但是之前组装了对应的表头,此时表头数据已经转换成了显示组件能够支持渲染的格式。 // // 这里就可以直接获取表头数据首先进行渲染。 // panel.add(table.getTableHeader(), BorderLayout.NORTH); // // // 这里把表格数据进行渲染。 // panel.add(table, BorderLayout.CENTER); } JFrame jFrame = new JFrame("测试窗口"); jFrame.setContentPane(panel); jFrame.pack(); jFrame.setVisible(true); jFrame.setLocationRelativeTo(null); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } }
效果图