私も同じ問題を抱えていて、それについて探していました。これまでのところ、私はそれを行う2つの方法を見つけました。
- 「自分で書き直した場合」の方法:Javaから基本クラスを変更します。
TableColumn
「resizingAllowed」のような新しいプロパティが必要になる場合は、「reorderingAllowed」が必要になります。これから、変更は次の場所で行われBasicTableHeaderUI
ます。
すでにあります:
private static boolean canResize(TableColumn column,
JTableHeader header) {
return (column != null) && header.getResizingAllowed()
&& column.getResizable();
}
それも必要です:
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& column.getReorderable();
}
(最初の列だけを移動させたくない場合は、TableColumnsを変更せずに移動できることに注意してください。
private static boolean canMove(TableColumn column,
JTableHeader header) {
return (column != null) && header.getReorderingAllowed()
&& header.getColumnModel().getColumnIndex(column.getIdentifier()) != 0;
}
)。
その後、MouseInputListener
:で変更する2つの場所
たとえば「canMove()」メソッドを使用して、この新しいインデックスを移動できる場合は、条件を追加する必要があります。このように、列をこの不動の列にドラッグする場合でも、列をドラッグしますが、列を入れ替えることはありません。
このメソッドでは、JTableに使用されるJTableHeaderのUIを明示的に設定する必要があることに注意してください。これは、実際には理想的ではありません。しかし、これは想定されている場所の問題を扱っているため、最も適しています。
- 「実際にあるもので通常の動作をブロックしてみましょう」メソッド:UIを変更せずに、このメソッドはJTableHeaderに焦点を合わせて、UIによって作成されたコマンドをブロックします。
まず、最初の列のドラッグをブロックするには、このオーバーライドされたメソッドを使用して、JTableHeaderのサブクラスが必要です。
@Override
public void setDraggedColumn(TableColumn pAColumn)
{
int lIndex = -1;
if (pAColumn != null)
lIndex = getColumnModel().getColumnIndex(pAColumn.getIdentifier());
if (lIndex != 0)
super.setDraggedColumn(pAColumn);
}
これにより、ユーザーが最初の列をドラッグできなくなります。ただし、前述のように、これは問題の一部にすぎません。別のドラッグされた列がこの最初の列とスワップしないようにする必要があります。
これまでのところ、これに対する正しい方法はありません。TableColumnModelをサブクラス化し、moveColumn()
メソッドをオーバーライドしてみました。
@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
//Move only if the first column is not concerned
if (pColumnIndex =! 0 && pNewIndex != 0)
super.moveColumn(pColumnIndex, pNewIndex);
}
ただし、これは機能しません。UIはmouseDragged
メソッド内のマウスの位置を更新するため、ドラッグした列から別の場所にジャンプします。
それで私はまだ探しています、そして誰かがこの部分に関して提案を持っているかどうか疑問に思います。