将自定义jtable模型表类作为参数传递

时间:2013-03-30 00:37:54

标签: java swing netbeans jtable

我有一个带有tappedpane的jframe  两个标签。每个选项卡都包含一个jtable  每个jtable都连接到一个单独的tablemodel jframe类有一个渲染器方法 将列的宽度调整为 列中最长文本的长度 渲染器方法被硬编码为其中一个 表模型。但是想传递tablemodel类 将renderer方法作为变量。

这是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

关于如何实现这一目标的任何建议

1 个答案:

答案 0 :(得分:4)

  下面的

是渲染器方法的代码

这不是渲染器方法。这只是一种方法。

  

问题是表模型类每个都扩展了AbstractModelTable

那没关系。渲染器属于表而不是模型。因此,您为setColumnWidth()方法发布的代码适用于任何JTable。您真正需要做的是更改代码以接受您要使用的表的参数。因此该方法应如下所示:

public void setColumnWidth(JTable table)
{
    ...
}

现在在那个你看到变量“resultTable”的方法中,你应该把它改成“table”。

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