2

2 つのタブがあるタップペインを持つ jframe があります。各タブには jtable が含まれ、各 jtable は個別のテーブルモデルに接続されています jframe クラスには、列の幅を列内の最も長いテキストの長さに調整するレンダラー メソッドがあります レンダラー メソッドは、テーブル モデルの 1 つにハード コードされています. ただし、tablemodel クラスをレンダラー メソッドに変数として渡したいと考えています。

これはモデルデータのコードです

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 を拡張することです

これを達成する方法についての提案

4

1 に答える 1

4

以下はレンダラーメソッドのコードです

これはレンダラー メソッドではありません。それは単なる方法です。

問題は、テーブルモデルクラスがそれぞれ AbstractModelTable を拡張することです

それは問題ではありません。レンダラーは、モデルではなくテーブルに属します。したがって、setColumnWidth() メソッド用に投稿したコードは、どの JTable でも機能します。実際に行う必要があるのは、操作するテーブルのパラメーターを受け入れるようにコードを変更することです。したがって、メソッドは次のようになります。

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

そのメソッドで変数「resultTable」が表示されている場所はどこでも、「table」に変更する必要があります。

もう 1 つのオプションは、任意のテーブルで使用できる別のクラスであるTableColumnAdjusterを使用することです。

于 2013-03-30T01:37:28.067 に答える