传递自定义jtable modeltable类作为参数



我有一个带有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"。

另一个选择是使用TableColumnAdjuster,它已经是一个单独的类,你可以使用任何表

相关内容

  • 没有找到相关文章

最新更新