2017-06-03 9 views
0

TreeCellRendererJTableであるJTreeTableを作成しました。これにより、各行に異なるTableColumnModelを持つことができます。 JTreeの兄弟はTableColumnModelを共有します。それは素晴らしい作品です。私は行を選択し、異なるレベルであっても他の行のデータを実際に変更することなく、異なる列のセットを表示することができます。JTableが列幅のサイズを変更しています

別の行を選択すると、JTableが私のTableColumnの幅を変更し、それを好ましいサイズに設定するところに問題があります。その結果、1つの列の幅をドラッグし、別の行を選択すると、それを望ましいサイズに戻すことができます。

これを修正するために、TableColumnModelListenerを追加するなど、さまざまなことを試しました。また、幅を変更するときに、列の優先サイズを設定しました。これは、JTableが変更後に推奨サイズを15に設定しているため、機能しません。

私はこれを引き起こしているコードをトレースしました。私の悲しみを引き起こす方法はJTable.doLayout()です。そのメソッドはプライベートメソッドsetWidthsFromPreferredWidths(...)を呼び出しています。このメソッドは、TableColumnの幅を設定します。

公開されているのでdoLayout()メソッドをオーバーライドしようとしましたが、すでにメソッドをオーバーライドしているときにsuper.doLayout()を呼び出すことができませんでした。あなたが想像することができるように、それは非常に奇妙なUIの問題を引き起こします。私はJComponentJTableのスーパークラスにthisをキャストしようとしましたが、スタックオーバーフローエラーが発生します。とにかくこれは正しい解決策のようには感じられません。

私のJTableは、スクロールペインの内部ではなく、ツリーセルのレンダラーとしてのパネルの内側にあるため、レイアウトに問題があると考えられます。確かにわかりません。以下は、私は上記参照プライベートメソッドの内部のコードです:

private void setWidthsFromPreferredWidths(final boolean inverse) { 
    int totalWidth  = getWidth(); 
    int totalPreferred = getPreferredSize().width; 
    int target = !inverse ? totalWidth : totalPreferred; 

    final TableColumnModel cm = columnModel; 
    Resizable3 r = new Resizable3() { 
     public int getElementCount()  { return cm.getColumnCount(); } 
     public int getLowerBoundAt(int i) { return cm.getColumn(i).getMinWidth(); } 
     public int getUpperBoundAt(int i) { return cm.getColumn(i).getMaxWidth(); } 
     public int getMidPointAt(int i) { 
      if (!inverse) { 
       return cm.getColumn(i).getPreferredWidth(); 
      } 
      else { 
       return cm.getColumn(i).getWidth(); 
      } 
     } 
     public void setSizeAt(int s, int i) { 
      if (!inverse) { 
       cm.getColumn(i).setWidth(s); 
      } 
      else { 
       cm.getColumn(i).setPreferredWidth(s); 
      } 
     } 
    }; 

    adjustSizes(target, r, inverse); 
} 

は、コードを見てみると、私は何が起こっていることは、それは考えているのでgetWidth()方法は、JTableはpreferredSizeがに列のサイズを変更したい引き起こしているということだと思いますそれは十分な部屋がありません。私はローカルでこのメソッドを貼り付けるだけでコピーを試みましたが、プライベートメソッドが含まれていて、深く深くなってきたので、私はそれを止めました。その目的は、幅を調整する理由をデバッグしようとすることでした。私が根本的な原因に対処できれば、それはこれに最適な解決策かもしれません。

JTreeは、JScrollPaneの内部にあります。 JTableHeaderViewPortColumnHeaderViewに設定されています。以下は、私が別の行を選択している2つのイメージです。ヘッダーの配置を無視して、私はすでにそれを完全に実装していないための解決策があります。

JTreeTable-Level1 JTreeTable-Level2

問題上の任意の考えをいただければ幸いです。また、役に立つと思うコードを投稿しても幸いです。

答えて

0

多くの変更と調査の後、テーブル用のスクロールペインがないためでした。私は元々そうしていませんでした。なぜなら、それは周りにファンキーな国境を設定し、国境をヌルにすることはうまくいかなかったからです。私がしなければならなかったことは、空の境界線を設定することでした。

関連する問題