你好,在吗使用JTable AbstractTableModel显示数据,谁会的找我啊,我在这里先谢谢了。
我自己研究swing好多年,有很多组件我都有自己封装的代码,其中JTable我有自己的封装。封装后非常简单,三到4行代码就可以完成数据的创建和添加。并且可以根据内容自适应列宽,调整列宽后记忆宽度,字段列名映射等功能。你如果需要可以联系我发你
如果你不需要封装好的,你可以参考我的DEMO来自己写,这个demo中TableModel也稍微封装了一下。继承的
DefaultTableModel,DefaultTableModel则是继承与AbstractTableModel,很简单,这个例子应该是可以直接运行的。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.bin.test;
import com.bin.component.table.TableModel;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
/**
*
* @author wydxbg
*/
public class JTableTest extends JFrame {
public static void main(String[] arg) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new JTableTest().setVisible(true);
}
});
}
public JTableTest() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭的行为
setPreferredSize(new Dimension(800, 600));//设置组件的大小
setSize(new Dimension(800, 600));//设置组件的大小
GridBagLayout layout = new GridBagLayout();//定义网格包布局
setLayout(layout);//设置布局为网格包布局
initComponents();//这是初始化组件的代码
addTableData();//你关心的添加数据代码在这里
}
private JScrollPane scrollPane = new JScrollPane();//创建滚动面板
private JTable table = new JTable();//创建JTABLE
private TableModel model = new TableModel();//创建TABLE的model
private void initComponents() {
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;//网格包拉伸模式为全部,也就是会向上下和左右拉伸
gbc.weightx = 1d;//X方向拉伸的权重
gbc.weighty = 1d;//y方向的拉伸权重
table.setModel(model);//将table的model替换为 TableModel
scrollPane.setViewportView(table);//将table添加到滚动面板,这样数据量比较多的时候可以有滚动条
add(scrollPane, gbc);//添加组件到JFrame
}
private void addTableData() {
model.addColumn("添加列1");//添加标题
model.addColumn("添加列2");//添加标题
Object[] value1 = new Object[]{'1','2'};
model.addRow(value1);//添加数据
Object[] value2 = new Object[]{'a','b'};
model.addRow(value2);//添加数据
}
}
package com.bin.component.table;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.table.DefaultTableModel;
public class TableModel extends DefaultTableModel {
public TableModel() {
}
private Map<Integer, Class> columnClass = new HashMap<Integer, Class>();
public void setColumnClass(int column, Class classType) {
columnClass.put(column, classType);
}
/**
* 控制指定单元格是否可编辑,目前默认所有的均不可编辑
*
* @param row
* @param column
* @return
*/
public boolean isCellEditable(int row, int column) {
return isCellEditable;
}
private boolean isCellEditable = false;
/*设置表格的每一列均可编辑**/
public void setAllCellEditable(boolean isEditable) {
isCellEditable = isEditable;
}
//根据列名和行号获取数据
public String getStringValueAt(int row, String columnName) {
return getValueAt(row, columnName) == null ? null : getValueAt(row, columnName).toString();
}
//根据列号和行号获取数据
public String getStringValueAt(int row, int column) {
return getValueAt(row, column) == null ? null : getValueAt(row, column).toString();
}
//根据列名和行号获取数据
public Object getValueAt(int row, String columnName) {
for (int i = 0; i < getColumnCount(); i++) {
if (columnName.equals(getColumnName(i))) {
return getValueAt(row, i);
}
}
return null;
}
//根据列号和行号获取数据
@Override
public Object getValueAt(int row, int column) {
if (getRowCount() == 0 || row < 0 || column < 0) {
return null;
}
if(row>=getRowCount()&&column>=getColumnCount()){
return null;
}
Object value;
if (valueRenders.size() > 0) {
for (int i = 0; i < valueRenders.size(); i++) {
if (valueRenders.get(i).index == column) {
value = valueRenders.get(i).getValue(super.getValueAt(row, valueRenders.get(i).index));
if (value != null) {
return value;
}
}
}
}
return super.getValueAt(row, column);
}
//对指定单元格设置数据
@Override
public void setValueAt(Object aValue, int row, int column) {
if (getRowCount() == 0 || row < 0 || column < 0) {
return;
}
super.setValueAt(aValue, row, column);
}
private List<Render> valueRenders = new ArrayList<Render>();
public void addValueRender(int columnIndex, Map<Object, Object> values) {
valueRenders.add(new Render(columnIndex, values));
}
public class Render {
private Render(int index, Map<Object, Object> renderValue) {
this.index = index;
this.renderValues = renderValue;
}
private int index;
private Map<Object, Object> renderValues = new HashMap<Object, Object>();
private Object getValue(Object value) {
if (renderValues == null) {
return value;
}
return renderValues.get(value);
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(index).append("\n");
Iterator it = renderValues.keySet().iterator();
Object key = null;
while (it.hasNext()) {
key = it.next();
sb.append("[").append(key).append("=").append(renderValues.get(key)).append("]");
}
return sb.toString();
}
}
}
String[] columnNames = {"药物编号","药物名称","俗称","类型(编号或名称)","计量方式","出厂价","销售价","出厂日期","保质期","厂商" };
Object[][] tableData = {{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""},{"","","","","","","","","",""}};
TableModel model=new DefaultTableModel(tableData,columnNames);//TableModel为AbstractTableModel的子类
table = new JTable(model);
table.setRowHeight(30);
Font ft = new Font("宋体", Font.BOLD, 20);
//设置表格内容字体
table.setFont(ft);
//设置表格字体
JTableHeader tab_header=table.getTableHeader();//表头
tab_header.setFont(ft);//设置表头字体
tab_header.setResizingAllowed(false);//列大小不可改变
tab_header.setReorderingAllowed(false);//不可整列移动
//设置表格内容居中
DefaultTableCellRenderer tcr=new DefaultTableCellRenderer();
tcr.setHorizontalAlignment(JLabel.CENTER);//设置内容居中显示
table.setDefaultRenderer(Object.class,tcr);
JScrollPane csp=new JScrollPane(table);//建立一个带滚动条的容器,把表格加进去
this.add(csp,BorderLayout.CENTER);//把容器加到Frame窗口里里