1

JavaFX プロジェクトに問題があります。わからない瞬間があります。私が理解している限り、次のコードは、TableView のインスタンスであるtableのすべてのスクロール イベントを処理できるはずです。

        table.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent scrollEvent) {
                System.out.println("Hello!");
                int i = 0;
                int length = table.getItems().size();
                for(Node n: table.lookupAll("TableRow")) {
                    if (n instanceof TableRow) {
                        TableRow row = (TableRow) n;
                        if(table.getItems().get(i).getType() == "fwfx") {                    
                            row.setStyle("-fx-background-color: forestgreen;");
                        }
                        i++;
                    }
                    if(i == length) {
                        break;
                    }
                }
            }
        }
    );

アプリケーションを起動するたびに、表示されている行に対してのみ行が正しく強調表示されます。分かったから

table.lookupAll("TableRow")

は、17 個のノードのみのセットを返します。でも

table.getItems().size()

正しい行数を示します。テーブルを下にスクロールすると、不適切な行が強調表示されます。私は少し迷っています。

問題は、テーブルのスクロール イベントを正しく処理するにはどうすればよいかということです。表示されるだけでなく、テーブルのすべての行を処理する必要があります。

4

3 に答える 3

9

最後に、スクロール イベントを処理する方法を見つけたので、私の経験を共有したいと思います。Scenic Viewを使用すると、TableView setOnScroll イベントは、マウス ホイールをカーソルで列ヘッダーの上にスクロールしたときにのみ発生することがわかりました。しかし、カーソルがテーブル データの上にあるときに ScrollEvent を処理できるようにするには (この例で必要だったものです)、確実に EventFilter を使用する必要があります。たとえば、以下のコールドは、TableView のインスタンスのすべてのスクロール イベントを処理します。

    table.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent scrollEvent) {
               System.out.println("Scrolled.");
            }
     });

Scenic View は、TableView が後で構成されているものについてのヒントも与えてくれました。

stage.show()

働きました。

まだ間違って行を強調表示していますが)...

于 2012-11-05T12:41:42.180 に答える
1

スクロールバーの値の変化を聞く

for (Node node : dataTable.lookupAll(".scroll-bar"))
{
    if  (node instanceof ScrollBar && ((ScrollBar) node).getOrientation().equals(Orientation.VERTICAL))
    {
        ((ScrollBar) node).valueProperty().addListener(formatBUIScrollChangeEventHandler);
    }
}

これは、テーブル上でのあらゆる形式のスクロールでトリガーされます。

自分の状況を解決するときに、何時間も費やして、ようやくこのアイデアにたどり着きました。

于 2015-02-09T19:38:58.430 に答える
0

質問は古いですが、まだ回答を投稿/承認していません。

だから、これは助けになるはずです:tableView.refresh(). Java 8u60 以降の JavaFX で使用できます。

ScrollEvent 内で呼び出す必要があります。また、おそらく ScrollBar を並べ替えてドラッグすることもできます (こちらの回答を参照してください)。

于 2016-11-16T07:25:26.293 に答える