web-dev-qa-db-ja.com

Java JTable設定列幅

次のように列サイズを設定する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プロパティを見つけましたが、機能しません。

編集:JTableJScrollPaneにあり、その優先サイズが設定されています。

88
Hamza Yerlikaya

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

JTableのJavaDocで、 doLayout() のドキュメントを注意深く読んでください。以下にいくつかの選択ビットを示します。

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

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

注:JTableが列の幅を調整するとき、JTableは最小値と最大値を絶対に尊重します。

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

42
Eddie

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

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

22
akf

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);
11
Rico Ocepek

この方法を使用してください

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);
5
Oleg Mikhailov

クレオパトラの発言を読んで(彼女は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);
4
michel.iamit
fireTableStructureChanged();

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

1
count0

このコードを使用してください。それは私のために働いた。 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);
        }
0
Arijit