2009-03-17 11 views
0

GlazedListsを使用して、JScrollbarPaneのJTableで使用するEventListからEventTableModelを自動生成しています。ビューポートでJTableを選択する

私はEventListをFIFOとして使用していますが、最後に要素の束が追加されてから、一連の要素が先頭から削除されることがあります。要素が削除されると、選択範囲は期待どおりに機能します。選択範囲のインデックスが変更されても、同じ要素が選択されます(または少なくともテーブル内にある要素)。それは素晴らしい。

明らかに、オブジェクトが最初に項目を削除したためにインデックスを変更した場合、ビューポートにオブジェクトの固定範囲と固定範囲のインデックスが表示され続けることはありません。デフォルトの動作は、ビューポートを同じに保つことです。

選択したオブジェクトをビューポート内の同じ場所に保存したい場合は、その方法がありますか? (例えば、EventTableModelやJScrollbarPaneなどのイベントリスナーを設定し、右のスクロールバーの設定を計算して、最初からアイテムを削除すると、ビューポートがオブジェクトと共に移動するようにします)

答えて

1

あなたはスクロールバーを調整する必要はありませんが、あなたは、具体的RECTはどうあるべきかを述べることができるJTableの

public void scrollRectToVisible(Rectangle aRect) 

このようにarrowkeysを使用して、実際のスクロールを行いJViewportの で使用されているのJComponentのメソッド可視。 1行の行番号とピクセルの高さに基づいて計算を行うことができます。 また、このメソッドにブレークポイントを設定し、矢印キーでJtableに移動するときの動作を確認する

0

ScrollPane内のJTableに最初に選択した行を表示する別の方法は、垂直スクロールバーが表示している内容:

最初に、選択した最初の行をテーブルから取得します。複数の行が選択されている場合、これはまだ最初の行を取得するだけです。

int firstSelectedRow = table.getSelectedRow(); 

次に、選択した行がテーブルのどこにあるかを取得します。

Rectangle cellLocation = table.getCellRect(firstSelectedRow, 0, false); 

最後に、垂直スクロールバーにどこにあるかを伝えることができます。

scrollPane.getVerticalScrollBar().setValue(cellLocation.y); 

また、選択した行がない場合、ビューポートには表の一番上が表示されます。

私はむしろscrollRectToVisible()メソッドを使用しますが、なんらかの理由でそれは私のためには機能しませんでしたが、これは毎回動作するようです。

0

ここでは、テーブルのみに応じた別の解決策があります。このソリューションは、新しいビューで選択した行のy位置も保持します。

は、まず私たちは私たちの選択がビューにあったかどうかを確認、更新後に更新前のビューと選択四角形

Rectangle preUpdateViewRect = table.getVisibleRect(); 
Rectangle preUpdateSelectedCellRect = table.getCellRect(table.getSelectedRow(), 1, true); 

を保存したいです。このチェックでは、ユーザーが行を選択してスクロールアウトを開始した場合、ビューを選択範囲に戻さないようにします。選択が私たちの見解であったならば、私たちのビューの同じ場所で選択を持つ四角形を作成する簡単な数学を行います。

if(preUpdateViewRect != null && preUpdateViewRect.contains(preUpdateSelectedCellRect)) 
{ 
    Rectangle postUpadteSelectedCellRect = table.getCellRect(table.getSelectedRow(), 1, true); 
    int newViewPortY = postUpdateSelectedCellRect.y - (preUpdateSelectedCellRect.y - preUpdateViewRect.y); 
    Rectangle newViewRect = new Rectangle(preUpdateViewRect.x, newViewPortY , preUpdateViewRect.width, preUpdateViewRect.height); 
    table.scrollRectToVisible(newViewRect); 
} 
関連する問題