2

我正在尝试创建一个浏览器来实践 JavaFX。我用 Stack 实现了 Back 按钮。

  1. 当页面的 URL 发生变化时,将 url 添加到 Stack(java.util.Stack)
  2. 按下后退按钮时,从堆栈中弹出 1 项并显示页面

但这在 URL 重定向的情况下不起作用。例如。我输入http://www.google.com,它会自动重定向到http://www.google.co.in(印度)。这会在 Stack 中生成 2 个条目,这会破坏 Back 按钮逻辑,因为页面相同但取自不同位置。

请帮助我解决这个问题。

谢谢你的帮助

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 has a WebHistory object which has all the API you need to completely manage the history and it should take care of not adding redirected URLs to the history for you. And, if you don't want to use that, you can use webengine.executeScript("history.back()"); to have the engine's JavaScript engine handle the navigation for you.

Chris Gerken 所说的关于监控 http 状态返回码以确定是否将对象置于历史记录中的说法是正确的。JavaFX的难点在于WebEnginehttp状态返回码发生在网络层,没有通过WebEngine接口暴露出来。因此,如果您只是在执行过程中监控 WebEngine 的位置属性,那么很难获得高质量的导航界面。我在实现 JavaFX WebBrowser 以获得 JavaFX 体验时发现了这一点,并且我的浏览器的历史机制使用带有当前索引指针的 ObservableList 与您在问题中指出的问题完全相同。如果我今天再次实现相同的功能,我会使用新的WebHistory更高版本的 JavaFX 提供的功能,而不是自己编写。

于 2013-01-06T06:05:05.367 回答
0

我觉得你需要在你的逻辑中处理重定向。每当重定向发生时;不要将原始 URL 放在您的数据结构中(堆栈或 LinkedQueue 等等);仅将最终 URL 放入您的数据结构中。当发生 2-3 次重定向时,您甚至可能会遇到一些情况。你需要让它通用。

于 2013-01-05T12:56:09.810 回答
0

仅将您实际显示的 URL 放入您的堆栈中。在发送重定向时,您将返回 307 状态代码以及新 URL。只将该 URL 放入您的堆栈中(除非有一些奇怪的机会您又得到了另一个 307 ……但您明白了)。

而且您可能想使用列表而不是堆栈。这将使您前进和后退。您可能还需要坚持其他事情,例如使用的 HTTP 动词等。

于 2013-01-05T13:02:34.660 回答