4

ヘッダーが保持するテキストのサイズよりも小さくなるように、JTableのサイズが変更されないようにしようとしています。私が抱えている問題は、各ヘッダーコンポーネントの最小優先幅が10しかないことです。これは、各ヘッダーコンポーネントの値が「ヘッダー1」、「ヘッダー2」、「ヘッダー3」などの場合、明らかに小さすぎます。の上。

私はSOの検索に多くの時間を費やし、さまざまな提案を実装しようとしましたが、まだ解決策を見つけることができていません。拡張JTableの一部として使用している現在のコードを参照してください。

public class MyTable extends JTable {

private Map<Integer, Integer> minSizeMap;

public void calculateMinColumnSizes() {

    int width = 0;
    int row = 0;
    minSizeMap = new HashMap<Integer, Integer>();

    for (int column = 0; column < columnModel.getColumnCount(); column++) {
        TableColumn tableColumn = columnModel.getColumn(column);
        TableCellRenderer renderer = tableColumn.getCellRenderer();
        Component comp = this.prepareRenderer(renderer, row, column);
        width = Math.max(comp.getPreferredSize().width, width);
        minSizeMap.put(tableColumn.getModelIndex(), width);
    }
   }
}

元のコードは、 JTable列のサイズを文字列の長さに変更する方法に対するkleopatraの回答に基づいています。、しかし、現時点では、各列ヘッダーの最小推奨幅のみを取得し、サイズ変更後に後で比較できるように保存したいので、パーツを変更しました。

メソッドを呼び出す前にすべてのモデルが設定されているため、TableColumnのminWidthとpreferredWidthのデフォルトがそれぞれ15と75の場合に、コンポーネントの優先幅が10になる方法について少し戸惑います。

私が何をしたか/間違って理解したかについてのアイデアはありますか?

4

1 に答える 1

7

コードにいくつかの問題があります。

  1. Tableヘッダーレンダラーは使用しませんが、TableColumnセルレンダラー(異なる場合があります)を使用します
  2. ヘッダーではなく、最初の行の優先サイズをテストします
  3. あなたはwidth = Math.max(comp.getPreferredSize().width, width);単に意味をなさないものを使用します

これがあなたを動かすはずのスニペットです:


for (int column = 0; column < columnModel.getColumnCount(); column++) {
    TableColumn tableColumn = columnModel.getColumn(column);
    TableCellRenderer renderer = tableColumn.getHeaderRenderer();
    if (renderer == null) {
        renderer = getTableHeader().getDefaultRenderer();
    }
    Component component = renderer.getTableCellRendererComponent(this, 
             tableColumn.getHeaderValue(), false, false, -1, column);
    minSizeMap.put(tableColumn.getModelIndex(), component.getPreferredSize().width);
}
于 2012-05-29T22:30:50.653 に答える