2

JavaFX を実践するためのブラウザを作成しようとしています。スタックで戻るボタンを実装しました。

  1. ページのURLが変わったらStack(java.util.Stack)にURLを追加する
  2. 戻るボタンを押すと、スタックからアイテムを 1 つポップしてページを表示します

ただし、これは URL リダイレクトの場合には機能しません。例えば。http://www.google.comと入力すると、自動的にhttp://www.google.co.in (インド)にリダイレクトされます。これにより、スタックに 2 つのエントリが作成され、ページは同じであるが異なる場所から取得されているため、[戻る] ボタンのロジックが破損します。

この問題の解決にご協力ください。

ご協力いただきありがとうございます

webEngine.locationProperty().addListener(new ChangeListener<String>(){

        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            //urlField is a text Field
            urlField.setText(newValue);
            addURLToStack(oldValue);
            if(backButtonStack.size() ==1){ //means on last url of Stack
                backButton.setDisable(true);
            }
            else{
                backButton.setDisable(false); 
            }}      
    });
 backButton.setOnMouseClicked(new EventHandler<MouseEvent>(){

        @Override
        public void handle(MouseEvent event) {
            if(backButtonStack != null && !backButtonStack.isEmpty()){
                String poppedURL = backButtonStack.pop();
                webEngine.load(poppedURL);

            }
        }

    });
private void addURLToStack(String url) {
    if(backButtonStack == null){
        backButtonStack = new Stack<String>();
    }

    backButtonStack.push(url);
}
4

3 に答える 3

2

この問題を解決する必要はありません。

JavaFX WebEngineには、履歴を完全に管理するために必要なすべての API を持つWebHistoryオブジェクトがあり、リダイレクトされた URL を履歴に追加しないように処理する必要があります。また、それを使用したくない場合は、 を使用webengine.executeScript("history.back()");して、エンジンの JavaScript エンジンにナビゲーションを処理させることができます。

Chris Gerken の言うことは、http ステータスの戻りコードを監視して、オブジェクトを履歴に入れるかどうかを判断することについて正しいことです。JavaFX での問題WebEngineは、http ステータスの戻りコードがネットワーク層で発生し、WebEngine インターフェースを介して公開されないことです。したがって、WebEngine の location プロパティを監視しているだけでは、高品質のナビゲーション インターフェイスを実現することは非常に困難です。JavaFX エクスペリエンスを取得するために JavaFX WebBrowser を実装したときにこれを発見しました。現在のインデックス ポインターで ObservableList を使用するブラウザーの履歴メカニズムには、質問で指摘したのとまったく同じ問題がありました。今日も同じ機能を実装する場合は、新しいWebHistory独自に作成するのではなく、後の JavaFX バージョンによって提供される機能。

于 2013-01-06T06:05:05.367 に答える
0

ロジックでリダイレクトを処理する必要があると思います。リダイレクトが発生するたびに。元の URL をデータ構造 (スタックまたは LinkedQueue など) に入れないでください。データ構造に最終URLのみを入れてください。2 ~ 3 回のリダイレクトが発生すると、状況に直面することさえあります。ジェネリックにする必要があります。

于 2013-01-05T12:56:09.810 に答える
0

実際に表示する URL のみをスタックに入れます。送信リダイレクトでは、新しい URL と共にステータス コード 307 が返されます。その URL のみをスタックに入れます (何らかの奇妙なチャンスでさらに別の 307 が戻ってくる場合を除きますが、アイデアは得られます)。

また、おそらくスタックの代わりにリストを使用したいと思うでしょう。これにより、前にも後ろにも進むことができます。おそらく、使用されている HTTP 動詞など、他のことも保持する必要があります。

于 2013-01-05T13:02:34.660 に答える