我有一个带有tap - dpane的jframe两个选项卡。每个选项卡包含一个jtable每个jtable都连接到一个单独的表模型jframe类有一个渲染器方法将列的宽度调整为列中最长文本的长度渲染器方法被硬编码为表模型。但会喜欢传递表模型类到渲染器方法作为变量
这是modeldata 的代码public class MyTableModel extends AbstractTableModel {
private List<List<Object>> dataList = new ArrayList<>();
private String[] header = { "ID","SUBJECT","LETTTER FROM","LETTER DATE","DATE RECEIED",
"REMARKS","DATE DISPATCHED","DESTINATION OFFICE"};
private int minRowCount = 5;
public MyTableModel()
{ }
public List<List<Object>> getDataList() {
return dataList;
}
public void setDataList(List<List<Object>> dataList) {
this.dataList = dataList;
fireTableDataChanged();
fireTableStructureChanged();
}
public void setHeader(String[] header) {
this.header = header;
}
public String[] getHeader() {
return header;
}
@Override
public int getRowCount() {
return Math.max(minRowCount, dataList.size());
}
@Override
public int getColumnCount() {
return header.length;
}
@Override
public String getColumnName(int col) {
return header[col];
}
@Override
public Object getValueAt(int row, int col) {
Object value = null;
if(row < dataList.size())
{value = dataList.get(row).get(col);}
return value;
}
@Override
public Class<?> getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
{
return o.getClass();
}
}
return Object.class;
}
}
这是在jframe类
中初始化tabemdel对象的代码MyTableModel myModel = new MytableModel();
下面的是渲染器方法
的代码 public final void setColumnWidth( )
{ int width = 0; //width of column
int headerWidth = 0; //width of header
//create header renderrer
final TableCellRenderer headerRenderer = resultTable.getTableHeader().getDefaultRenderer();
for(int myColumn = 0 ;myColumn < resultTable.getColumnCount(); myColumn++)
{ width = 0;
headerWidth = 0;
width = 0;
Component hcomp = headerRenderer.getTableCellRendererComponent(
resultTable, resultTable.getModel().getColumnName(myColumn), false, false, 0, myColumn);
headerWidth = Math.max(hcomp.getPreferredSize().width , headerWidth);
resultTable.getColumnModel().getColumn(myColumn).setPreferredWidth(headerWidth);
//iterate through the rows to find the widest cell
for (int row = 0; row < resultTable.getRowCount(); row++) {
TableCellRenderer renderer = resultTable.getCellRenderer(row, myColumn);
Component comp = resultTable.prepareRenderer(renderer, row, myColumn);
width = Math.max (comp.getPreferredSize().width, width);
width = Math.max(width, headerWidth);
//set the columnwith to the widest cell
resultTable.getColumnModel().getColumn(myColumn).setPreferredWidth(width);
}
} }
的问题是表模型类扩展了AbstractModelTable
有什么建议吗
下面的是渲染器方法
的代码
这不是一个渲染器方法。它只是一个方法。
问题在于每个表模型类都扩展了AbstractModelTable
没关系。渲染器属于表而不是模型。因此,您为setColumnWidth()方法发布的代码将适用于任何JTable。您真正需要做的是更改代码以接受要处理的表的参数。所以这个方法应该是这样的:
public void setColumnWidth(JTable table)
{
...
}
现在,在该方法中所有你看到"resultTable"变量的地方,你应该把它改成"table"。