Java JTable設定の列幅


95

列サイズを次のように設定した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そのれる好ましいサイズが設定されています。

回答:


45

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

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

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

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

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

これは、最後の列以外のすべてにMin == Maxを設定し、最後の列にMin = Preferredを設定し、Maxを設定しないか、Maxに非常に大きな値を設定する必要があることを示しています。


1
setMinWidth(400)を使用しても、テーブルの右側が空になります
Hamza Yerlikaya

2
setMaxWidth(10000)を追加して、違いがあるかどうかを確認してください。
Eddie

1
行table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);を削除します。これにより、必要なサイズ変更ができなくなる可能性があります。
Eddie、

まだ設定していない場合は、JTable自体に最小サイズと最大サイズを設定することもできます
Eddie

3
テーブルモデルを適用したは、必ずsetMinWidth呼び出しを実行してください...これは、しばらくの間私をつまずきました。
Brian Knoblauch、2011

23

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

あなたがその満足したらAUTO_RESIZE_LAST_COLUMN、実際の作業ではありません、あなたはの組み合わせを試すことができますTableColumn.setMaxWidth()し、TableColumn.setMinWidth()


1
AUTO_RESIZE_LAST_COLUMNを使用すると、スクロールペインに合わせてテーブルのサイズが変更されます。私の目標は、テーブルを特定の最小サイズにして、最小サイズより大きい場合はテーブルを大きくすることです。
Hamza Yerlikaya、2009年

TableColumn.setMaxWidth()の代わりにTableColumn.setMinWidth()を使用すると、この動作が発生する可能性があります。
AKF

最後のコメントに追加するには、最後の列を含め、テーブルの各列に対してTableColumn.setMinWidth()を使用します。
akf 2009年

最小幅と最大幅の両方を設定すると問題は解決しましたが、スクロールバーが表示されなくなりました。
ハムザエリカヤ2009年

14

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);

5

この方法を使用

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);

4

クレオパトラの発言を読んで(彼女が2回目にjavax.swing.JXTableを参照することを提案しましたが、今は最初に参照していなかったのが残念です:))リンクをたどることをお勧めします

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

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);

1
私の知る限り、これは(非常に脆弱な)ハックです。ユーザーが列幅を変更しても更新されません。ここでも、JXTableのソースコードを確認することをお勧めします。追加のプロパティhorizo​​ntalScrollがあります。これは、列の設定の合計が現在の幅よりも小さい場合に利用可能な幅を埋め、それ以外の場合は水平スクロールバーを表示します
kleopatra

ユーザーが手動でテーブルの幅を変更するのに反応しないことは知っています。そのように、それはハックです...しかし、繰り返しますが、上記の提案よりも優れています。しかし、あなたは私をJXTableに好奇心をそそらせました...私はそこで見ます!(そして、テーブルの件名でもう一度あなたのところに
足を運ぶのはうれしい

あなたは正しかった、私の答えの上に私の発言を見てください、私はあなたの発言に賛成しました!
michel.iamit 2011

少なくともこれは私にとっては便利でした。カラムウェイトの原則を使用する私の場合にこのアプローチを使用しました。
Solostaran14 2013年

2
fireTableStructureChanged();

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


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);

0

このコードは、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);

-1

このコードを使用します。それは私のために働いた。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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.