2016-12-23 3 views
0

基本的には、私のJTableは各行に対して特殊な行高さを求めています。使用される各レンダラーは、各セルの要求された行高さを表内のマップに書き込みます。表には、マップを使用して行高さを設定するメソッドupdateRowHeightsがあります。問題は、行高さのマップがレンダラーによって高さで満たされていることです。したがって、最初にテーブルがレンダリングされると、マップはまだ空です。したがって、表が最初に表示されるとき、行の高さは設定されません。JTableがレンダリングされた後にメソッドを呼び出す:onRenderFinishedイベントはありますか?

私はテーブルにコンポーネントのリスナーを追加して行の高さを更新しています。ほとんどの場合、これはうまく動作しますが、たとえば、テーブルがタブ区画内のスクロールペインにあるときは呼び出されません。好ましくは、onRenderingFinishedのようなメソッドがあり、row-heightsメソッドを呼び出すことができます。

私はHow to set the RowHeight dynamically in a JTableという最初の答えのようなことをしています。レンダラ内からテーブルの行の高さを変更しないでください(私はそれに同意します)。そして、初期化が完了した後、そしてそれが依存している状態のいずれかがかわった。"

私の質問は:どこでupdateRowHeightに電話しますか?

レンダラが終了したことを通知するイベントはありますか?

答えて

2

セルの高さの高さに応じてテーブルの行の高さのみを更新する場合は、テーブルの内容が設定された後にこのメソッドを呼び出す必要があります。

public static void updateRowHeight(JTable table, int margin) { 
    final int rowCount = table.getRowCount(); 
    final int colCount = table.getColumnCount(); 
    for (int i = 0; i < rowCount; i++) { 
     int maxHeight = 0; 
     for (int j = 0; j < colCount; j++) { 
      final TableCellRenderer renderer = table.getCellRenderer(i, j); 
      maxHeight = Math.max(maxHeight, table.prepareRenderer(renderer, i, j).getPreferredSize().height); 
     } 
     table.setRowHeight(i, maxHeight + margin); 
    } 
} 

マージンは、各行に追加のスペースを提供するためのオプションのパラメータです(0または肯定的かもしれません)。

注意:この方法では、テーブルが非常に大きく、たくさんのHTML文字列が含まれている場合にパフォーマンスの問題が発生する可能性があります。

+0

これはすばらしい回避策です。しかし、JTextAreaをベースとして(JLabelの代わりに)、getPreferredSize()メソッドは期待どおりに動作せず、代わりに使用するメソッドは非常に高速ではありません(20000行テーブルでは数秒です)。第2に、updateRowHeightメソッドは、別の列でテーブルをソートした後にも呼び出さなければなりません。私の場合、いくつかのcomponentEventのrowheightsを更新し、レンダラーの高さをあらかじめ計算するのはずっと高速です。 (しかし、醜いです...そして、セルが変更可能な場合、componentEventウェイは使用不可能になります) –

+0

また、レンダリングの後に当然存在しない場合(例えば、行が追加、削除、変更された場合など) 、並べ替え)。このソリューションはあまり時間効率的ではないので、残念ながら私の問題は解決しません(JTextAreaセルがない場合でさえも)。 –

+0

あなたの問題を理解できるように、[SSCCE](http://sscce.org)を入力してください。もちろん、JTextAreaでは、JTextAreaが高さを決定するために少なくとも固定幅を必要とするため、このアプローチは機能しません。大規模な表に対しては、小さな表またはパネルにプレーン・テキスト・ラベルの構成を持つHTMLラベルを使用できます。 –

関連する問題