簡體   English   中英

在推入和打印兩個數組列表的值時保持順序

[英]Maintaining sequence in pushing and printing values of two arraylists

我正在嘗試構建網絡瀏覽器,並且正在使用WebView來獲取網頁。 我需要獲取URL和標題名稱以存儲歷史記錄。

所以我嘗試了這種方式:

 private void currentScene() {
    Platform.runLater(new Runnable() {
        @Override
        public void run() {

            WebView view = new WebView();
            engine = view.getEngine();

            engine.createPopupHandlerProperty();
            engine.titleProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            if (newValue != null) {
                                //stores the title name in an arraylist
                                title.add(newValue);
                            }
                        }

                    });
                }
            });

            engine.locationProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            //stores the URL in another arraylist
                            titleUrl.add(newValue);
                            //sets the text of the location text field
                            locationTextField.setText(newValue);
                        }
                    });
                }
            });

            jfxPanel.setScene(new Scene(view));
        }
    });
 }

我打印出了這些值:

 for (int i = 0; i < title.size(); i++) {
           System.Out.Println(title.get(i)+" : "+titleUrl.get(i));        
        }

但是我的輸出就像

Google : http://www.yahoo.com
Yahoo : http://www.google.com

誰能告訴我我哪里出錯了? 提前致謝。

如果您知道調用2個偵聽器的時間順序(例如始終始終調用titleProperty偵聽器),則可以檢查第二個偵聽器的第一個列表的長度,並且僅在第一個偵聽器的列表為時才添加內容第二個偵聽器列表中的元素大1個元素

這是解決方案的重要部分

  if (title.size() == titleUrl.size() + 1) {
      titleUrl.add(newValue);
  }

因此,如果滿足兩個條件,則此解決方案將起作用

1)始終觸發兩個事件(在任何情況下都不會觸發僅一個事件)

2)總是兩個事件都以相同的順序觸發titleProperty監聽器,然后locationProperty監聽器

這是完整的代碼

   private void currentScene() {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {

                WebView view = new WebView();
                engine = view.getEngine();

                engine.createPopupHandlerProperty();
                engine.titleProperty().addListener(new ChangeListener<String>() {
                    @Override
                    public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                if (newValue != null) {
                                    //stores the title name in an arraylist
                                    title.add(newValue);
                                }
                            }

                        });
                    }
                });

                engine.locationProperty().addListener(new ChangeListener<String>() {
                    @Override
                    public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) {
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                //stores the URL in another arraylist
                                if (title.size() == titleUrl.size() + 1) {
                                    titleUrl.add(newValue);
                                }
                                //sets the text of the location text field
                                locationTextField.setText(newValue);
                            }
                        });
                    }
                });

                jfxPanel.setScene(new Scene(view));
            }
        });
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM