TreeCellRenderer
がJTable
であるJTreeTable
を作成しました。これにより、各行に異なるTableColumnModel
を持つことができます。 JTree
の兄弟はTableColumnModel
を共有します。それは素晴らしい作品です。私は行を選択し、異なるレベルであっても他の行のデータを実際に変更することなく、異なる列のセットを表示することができます。JTableが列幅のサイズを変更しています
別の行を選択すると、JTableが私のTableColumn
の幅を変更し、それを好ましいサイズに設定するところに問題があります。その結果、1つの列の幅をドラッグし、別の行を選択すると、それを望ましいサイズに戻すことができます。
これを修正するために、TableColumnModelListener
を追加するなど、さまざまなことを試しました。また、幅を変更するときに、列の優先サイズを設定しました。これは、JTableが変更後に推奨サイズを15に設定しているため、機能しません。
私はこれを引き起こしているコードをトレースしました。私の悲しみを引き起こす方法はJTable.doLayout()
です。そのメソッドはプライベートメソッドsetWidthsFromPreferredWidths(...)
を呼び出しています。このメソッドは、TableColumnの幅を設定します。
公開されているのでdoLayout()
メソッドをオーバーライドしようとしましたが、すでにメソッドをオーバーライドしているときにsuper.doLayout()
を呼び出すことができませんでした。あなたが想像することができるように、それは非常に奇妙なUIの問題を引き起こします。私はJComponent
のJTable
のスーパークラスに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
の内部にあります。 JTableHeader
はViewPortColumnHeaderView
に設定されています。以下は、私が別の行を選択している2つのイメージです。ヘッダーの配置を無視して、私はすでにそれを完全に実装していないための解決策があります。
問題上の任意の考えをいただければ幸いです。また、役に立つと思うコードを投稿しても幸いです。