Java 将列添加到现有的TableModel
我有一节课Java 将列添加到现有的TableModel,java,swing,jtable,abstracttablemodel,defaulttablemodel,Java,Swing,Jtable,Abstracttablemodel,Defaulttablemodel,我有一节课 public class A extends AbstractTableModel { ... } 我使用ResultSetMetaData构建TableModel以匹配数据库中的结果集 public class B extends JPanel { ... } 在B类中,我扩展了JPanel并添加了A类以显示我的表格。 我希望能够根据条件向表模型添加新列。我尝试过谷歌搜索,但显示的大多数示例都基于DefaultTableModel而不是AbstractTableModel
public class A extends AbstractTableModel
{
...
}
我使用ResultSetMetaData构建TableModel以匹配数据库中的结果集
public class B extends JPanel
{
...
}
在B类中,我扩展了JPanel并添加了A类以显示我的表格。
我希望能够根据条件向表模型添加新列。我尝试过谷歌搜索,但显示的大多数示例都基于DefaultTableModel
而不是AbstractTableModel
有人知道如何实现这一点吗?只要扩展DefaultTableModel,就可以访问它的所有方法。DefaultTableModel还扩展了AbstractTableModel,因此在代码的其他部分对AbstractTableModel的引用不会中断。当然更方便,但提供了更大的灵活性和更少的开销。有一个示例显示了一个包含
列表
,其中值
是一个值的模型。可以找到更多的例子。例如
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableColumnHider {
private JTable table;
private TableColumnModel tcm;
private Map hiddenColumns;
public TableColumnHider(JTable table) {
this.table = table;
tcm = table.getColumnModel();
hiddenColumns = new HashMap();
}
public void hide(String columnName) {
int index = tcm.getColumnIndex(columnName);
TableColumn column = tcm.getColumn(index);
hiddenColumns.put(columnName, column);
hiddenColumns.put(":" + columnName, new Integer(index));
tcm.removeColumn(column);
}
public void show(String columnName) {
Object o = hiddenColumns.remove(columnName);
if (o == null) {
return;
}
tcm.addColumn((TableColumn) o);
o = hiddenColumns.remove(":" + columnName);
if (o == null) {
return;
}
int column = ((Integer) o).intValue();
int lastColumn = tcm.getColumnCount() - 1;
if (column < lastColumn) {
tcm.moveColumn(lastColumn, column);
}
}
public static void main(String[] args) {
String[] columnNames = {"Name", "Size", "Type", "Date Modified", "Permissions"};
String[][] data = {
{"bin", "2", "dir", "Jun 9", "drwxr-xr-x"},
{"boot", "3", "dir", "Jun 9", "drwxr-xr-x"},
{"dev", "6", "dir", "Jul 12", "drwxr-xr-x"},
{"etc", "34", "dir", "Jul 12", "drwxr-xr-x"},};
JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
final TableColumnHider hider = new TableColumnHider(table);
JPanel checkBoxes = new JPanel();
for (int i = 0; i < columnNames.length; i++) {
JCheckBox checkBox = new JCheckBox(columnNames[i]);
checkBox.setSelected(true);
checkBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
JCheckBox cb = (JCheckBox) evt.getSource();
String columnName = cb.getText();
if (cb.isSelected()) {
hider.show(columnName);
} else {
hider.hide(columnName);
}
}
});
checkBoxes.add(checkBox);
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(scrollPane);
frame.getContentPane().add(checkBoxes, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类表格隐藏器{
专用JTable表;
私家中医药;
私有映射隐藏列;
公共表ColumnHider(JTable表){
this.table=表格;
tcm=table.getColumnModel();
hiddenColumns=newHashMap();
}
公共void隐藏(字符串列名称){
int index=tcm.getColumnIndex(columnName);
TableColumn column=tcm.getColumn(索引);
hiddenColumns.put(columnName,column);
hiddenColumns.put(“:”+columnName,新整数(索引));
tcm.removeColumn(柱);
}
公共无效显示(字符串列名称){
对象o=hiddenColumns.remove(columnName);
如果(o==null){
返回;
}
tcm.addColumn((TableColumn)o);
o=hiddenColumns.remove(“:”+columnName);
如果(o==null){
返回;
}
int列=((整数)o).intValue();
int lastColumn=tcm.getColumnCount()-1;
if(列<最后一列){
tcm.moveColumn(最后一列,第列);
}
}
公共静态void main(字符串[]args){
String[]columnNames={“名称”、“大小”、“类型”、“修改日期”、“权限”};
字符串[][]数据={
{“bin”、“2”、“dir”、“Jun 9”、“drwxr-xr-x”},
{“boot”、“3”、“dir”、“Jun 9”、“drwxr-xr-x”},
{“开发”、“6”、“目录”、“7月12日”、“drwxr-xr-x”},
{“etc”、“34”、“dir”、“7月12日”、“drwxr-xr-x”},};
JTable table=新的JTable(数据、列名称);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane=新的JScrollPane(表);
最终TableColumnHider hider=新TableColumnHider(表格);
JPanel复选框=新的JPanel();
for(int i=0;i
为了好玩,这里有一个@mKorbel的通用版本
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.table.*;
/**@见https://stackoverflow.com/questions/6796673 */
公共类表格隐藏器{
专用JTable表;
私家中医药;
隐藏私人地图=
新的HashMap();
公共表ColumnHider(JTable表){
this.table=表格;
this.tcm=table.getColumnModel();
}
公共void隐藏(字符串列名称){
int index=tcm.getColumnIndex(columnName);
TableColumn column=tcm.getColumn(索引);
IndexedColumn ic=新的IndexedColumn(索引,列);
if(hidden.put(columnName,ic)!=null){
抛出新的IllegalArgumentException(“重复列名”);
}
tcm.removeColumn(柱);
}
公共无效显示(字符串列名称){
IndexedColumn ic=隐藏。删除(columnName);
如果(ic!=null){
tcm.ADD列(ic列);
int lastColumn=tcm.getColumnCount()-1;
如果(ic.index<最后一列){
tcm.moveColumn(最后一列,ic.index);
}
}
}
私有静态类IndexedColumn{
私有整数索引;
私有表列;
公共IndexedColumn(整数索引,表列){
这个指数=指数;
this.column=列;
}
}
公共静态void main(字符串[]args){
字符串[]列名称={
“名称”、“大小”、“类型”、“修改日期”、“权限”
};
字符串[][]数据={
{“bin”、“2”、“dir”、“Jun 9”、“drwxr-xr-x”},
{“boot”、“3”、“dir”、“Jun 9”、“drwxr-xr-x”},
{“开发”、“6”、“目录”、“7月12日”、“drwxr-xr-x”},
{“etc”、“34”、“dir”、“7月12日”、“drwxr-xr-x”}
};
JTable table=新的JTable(数据、列名称);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane=新的JScrollPane(表);
最后一张桌子
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
/** @see https://stackoverflow.com/questions/6796673 */
public class TableColumnHider {
private JTable table;
private TableColumnModel tcm;
private Map<String, IndexedColumn> hidden =
new HashMap<String, IndexedColumn>();
public TableColumnHider(JTable table) {
this.table = table;
this.tcm = table.getColumnModel();
}
public void hide(String columnName) {
int index = tcm.getColumnIndex(columnName);
TableColumn column = tcm.getColumn(index);
IndexedColumn ic = new IndexedColumn(index, column);
if (hidden.put(columnName, ic) != null) {
throw new IllegalArgumentException("Duplicate column name.");
}
tcm.removeColumn(column);
}
public void show(String columnName) {
IndexedColumn ic = hidden.remove(columnName);
if (ic != null) {
tcm.addColumn(ic.column);
int lastColumn = tcm.getColumnCount() - 1;
if (ic.index < lastColumn) {
tcm.moveColumn(lastColumn, ic.index);
}
}
}
private static class IndexedColumn {
private Integer index;
private TableColumn column;
public IndexedColumn(Integer index, TableColumn column) {
this.index = index;
this.column = column;
}
}
public static void main(String[] args) {
String[] columnNames = {
"Name", "Size", "Type", "Date Modified", "Permissions"
};
String[][] data = {
{"bin", "2", "dir", "Jun 9", "drwxr-xr-x"},
{"boot", "3", "dir", "Jun 9", "drwxr-xr-x"},
{"dev", "6", "dir", "Jul 12", "drwxr-xr-x"},
{"etc", "34", "dir", "Jul 12", "drwxr-xr-x"}
};
JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
final TableColumnHider hider = new TableColumnHider(table);
JPanel checkBoxes = new JPanel();
for (int i = 0; i < columnNames.length; i++) {
JCheckBox checkBox = new JCheckBox(columnNames[i]);
checkBox.setSelected(true);
checkBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
JCheckBox cb = (JCheckBox) evt.getSource();
String columnName = cb.getText();
if (cb.isSelected()) {
hider.show(columnName);
} else {
hider.hide(columnName);
}
}
});
checkBoxes.add(checkBox);
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(scrollPane);
frame.getContentPane().add(checkBoxes, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
public void addColumn(String columnName, List columnData) {
headers.add(columnName);
colCount = headers.size();
if (columnData != null) {
for (int r = 0; r < localCache.size(); r++) {
((List)localCache.get(r)).add(columnData.get(r));
}
} else {
System.out.println("Null columnData passed");
}
fireTableStructureChanged();
}