101

次のように列サイズを設定する JTable があります。

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);

これは正常に機能しますが、テーブルを最大化すると、最後の列の右側に空白ができます。サイズ変更時に最後の列をウィンドウの最後までサイズ変更することは可能ですか?

ドキュメントでプロパティを見つけましAUTO_RESIZE_LAST_COLUMNたが、機能しません。

編集:好みのサイズが設定されJTableています。JScrollPane

4

9 に答える 9

45

の代わりsetMinWidth(400)最後の列を呼び出すとどうなりますか?setPreferredWidth(400)

の JavaDoc でJTable、 のドキュメントをdoLayout()注意深く読んでください。ここにいくつかの選択ビットがあります:

囲んでいるウィンドウのサイズ変更の結果としてメソッドが呼び出されると、resizingColumn は null になります。これは、サイズ変更が JTable の「外側」で行われ、この JTable の自動サイズ変更モードに関係なく、変更 (または「デルタ」) がすべての列に分散される必要があることを意味します。

これがAUTO_RESIZE_LAST_COLUMNあなたを助けなかった理由かもしれません。

注: JTable が列の幅を調整する場合、列の最小値と最大値が完全に考慮されます。

これは、最後の列を除くすべての列に対して Min == Max を設定し、最後の列で Min = Preferred を設定し、Max を設定しないか、Max に非常に大きな値を設定することを意味します。

于 2009-06-05T03:40:40.270 に答える
24

を使用JTable.AUTO_RESIZE_OFFすると、テーブルはどの列のサイズも変更しないため、好みの設定が適用されます。最後の列がペインの残りの部分を埋めることを除いて、列を既定のサイズにすることが目標である場合、JTable.AUTO_RESIZE_LAST_COLUMNautoResizeModeを使用するオプションがありますがTableColumn.setMaxWidth()、TableColumn の代わりに使用すると最も効果的です。最後の列以外のすべての setPreferredWidth() 。

実際に機能することに満足したら、とAUTO_RESIZE_LAST_COLUMNの組み合わせを試すことができます。TableColumn.setMaxWidth()TableColumn.setMinWidth()

于 2009-06-05T03:48:28.477 に答える
16

JTable.AUTO_RESIZE_LAST_COLUMNこれは、コードの最後でautoresizemodeを設定する必要があることを意味します。そうしないと、 setPreferredWidth() は何にも影響しません!

したがって、あなたの場合、これは正しい方法です:

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
于 2014-01-22T22:07:38.240 に答える
6

この方法を使用する

public static void setColumnWidths(JTable table, int... widths) {
    TableColumnModel columnModel = table.getColumnModel();
    for (int i = 0; i < widths.length; i++) {
        if (i < columnModel.getColumnCount()) {
            columnModel.getColumn(i).setMaxWidth(widths[i]);
        }
        else break;
    }
}

JTableまたはクラスを拡張します。

public class Table extends JTable {
    public void setColumnWidths(int... widths) {
        for (int i = 0; i < widths.length; i++) {
            if (i < columnModel.getColumnCount()) {
                columnModel.getColumn(i).setMaxWidth(widths[i]);
            }
            else break;
        }
    }
}

その後

table.setColumnWidths(30, 150, 100, 100);
于 2016-06-01T07:16:48.007 に答える
4

クレオパトラの発言を読んでください (彼女は 2 回目にjavax.swing.JXTableを確認するよう提案しましたが、最初は確認できなくて申し訳ありません:)) リンクをたどることをお勧めします。

同じ問題に対してこの解決策がありました:(ただし、上記のリンクに従うことをお勧めします)テーブルのサイズを変更するときに、テーブルの列幅を現在のテーブルの合計幅に合わせます。これを行うには、(相対的な) 列幅に int のグローバル配列を使用します):

private int[] columnWidths=null;

この関数を使用して、テーブルの列幅を設定します。

public void setColumnWidths(int[] widths){
    int nrCols=table.getModel().getColumnCount();
    if(nrCols==0||widths==null){
        return;
    }
    this.columnWidths=widths.clone();

    //current width of the table:
    int totalWidth=table.getWidth();
    
    int totalWidthRequested=0;
    int nrRequestedWidths=columnWidths.length;
    int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);

    for(int col=0;col<nrCols;col++){
        int width = 0;
        if(columnWidths.length>col){
            width=columnWidths[col];
        }
        totalWidthRequested+=width;
    }
    //Note: for the not defined columns: use the defaultWidth
    if(nrRequestedWidths<nrCols){
        log.fine("Setting column widths: nr of columns do not match column widths requested");
        totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
    }
    //calculate the scale for the column width
    double factor=(double)totalWidth/(double)totalWidthRequested;

    for(int col=0;col<nrCols;col++){
        int width = defaultWidth;
        if(columnWidths.length>col){
            //scale the requested width to the current table width
            width=(int)Math.floor(factor*(double)columnWidths[col]);
        }
        table.getColumnModel().getColumn(col).setPreferredWidth(width);
        table.getColumnModel().getColumn(col).setWidth(width);
    }
    
}

私が呼び出すデータを設定するとき:

    setColumnWidths(this.columnWidths);

変更すると、テーブルの親に設定された ComponentListener を呼び出します (私の場合は、テーブルのコンテナーである JScrollPane です)。

public void componentResized(ComponentEvent componentEvent) {
    this.setColumnWidths(this.columnWidths);
}

JTable テーブルもグローバルであることに注意してください。

private JTable table;

そして、ここでリスナーを設定します。

    scrollPane=new JScrollPane(table);
    scrollPane.addComponentListener(this);
于 2011-12-12T17:30:17.227 に答える
3

このコードは、setAutoResizeModes がなくても機能します。

        TableColumnModel columnModel = jTable1.getColumnModel();
        columnModel.getColumn(1).setPreferredWidth(170);
        columnModel.getColumn(1).setMaxWidth(170);
        columnModel.getColumn(2).setPreferredWidth(150);
        columnModel.getColumn(2).setMaxWidth(150);
        columnModel.getColumn(3).setPreferredWidth(40);
        columnModel.getColumn(3).setMaxWidth(40);
于 2020-07-12T08:35:50.583 に答える
2
fireTableStructureChanged();

サイズ変更動作をデフォルトにします! 列のサイズ変更プロパティを設定した後にこのメソッドがコードのどこかで呼び出されると、すべての設定がリセットされます。この副作用は間接的に発生する可能性があります。プロパティが設定された後、このメソッドが呼び出される方法でリンクされたデータ モデルが変更された結果として Fe が発生します。

于 2012-06-06T14:50:19.933 に答える
1

オプションは必要ありません。最後の列の優先幅を最大にするだけで、余分なスペースがすべて使用されます。

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(Integer.MAX_INT);
于 2019-10-21T01:11:33.270 に答える
-3

このコードを使用します。それは私のために働いた。3列で検討しました。コードのループ値を変更します。

TableColumn column = null;
for (int i = 0; i < 3; i++) {
    column = table.getColumnModel().getColumn(i);
    if (i == 0) 
        column.setMaxWidth(10);
    if (i == 2)
        column.setMaxWidth(50);
}
于 2014-05-19T14:08:06.023 に答える