javafx以前的标签会影响最新标签

时间:2015-09-06 14:17:26

标签: javafx tabs

在创建新标签之前,一切正常。然后,当我转到上一个并尝试使用任何按钮时,它们会影响最新的选项卡而不是我选择的选项卡。但如果我转到最新的标签,它就像正常一样。这是我用来制作标签的类。那么,为什么以前的标签影响最新?我该如何解决?

public class JTab {

private javafx.scene.control.Tab tab;
private ImageView imgView;
private Image logo;
private BorderPane root;
private Button reloadButton, backButton, forwardButton;
private TextField field;
private WebView view;
private WebEngine engine;

private static JTab instance;
private JBrowser jBrowser;

private JTab(JBrowser jBrowser) {
   this.jBrowser =  jBrowser;
}

public static JTab getInstance(JBrowser browser) {
    if(instance == null)
        instance = new JTab(browser);
    return instance;
}

public javafx.scene.control.Tab addTab() {
    tab = new Tab();
    tab.setText("New Tab");
    tab.setOnClosed(event2 -> {
        if(jBrowser.getTabPane().getTabs().size() == 1) {
            jBrowser.getTabPane().setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
        }
    });

    logo = new Image("unknown-document.png");
    imgView = new ImageView(logo);
    tab.setGraphic(imgView);

    HBox hBox = new HBox(5);
    hBox.setAlignment(Pos.CENTER);

    reloadButton = new Button("Reload");
    backButton = new Button("<");
    forwardButton = new Button(">");

    reloadButton.setOnAction(event1 -> engine.reload());
    backButton.setOnAction(event1 -> loadData(goBack()));
    forwardButton.setOnAction(event1 -> loadData(goForward()));

    //The TextField for entering web addresses.
    field = new TextField("Enter URL");
    field.setPrefColumnCount(50); //make the field at least 50 columns wide.
    field.focusedProperty().addListener((ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) -> { //When click on field entire thing selected
        Platform.runLater(() -> {
            if (field.isFocused() && !field.getText().isEmpty()) {
                field.selectAll();
            }
        });
    });
    field.setOnKeyPressed(event -> { //When ENTER is pressed it will load page
        if (event.getCode() == KeyCode.ENTER) {
            if (!field.getText().isEmpty()) {
                loadData(field.getText());
            }
        }
    });

    //Add all out navigation nodes to the vbox.
    hBox.getChildren().addAll(backButton, forwardButton, reloadButton, field);

    view = new WebView();

    engine = view.getEngine();
    engine.setJavaScriptEnabled(true);
    engine.getLoadWorker().stateProperty().addListener(
            (ov, oldState, newState) -> {
                if (newState == Worker.State.SUCCEEDED) {
                    tab.setText(getTitle());
                    //TODO setGraphic
                }
            });
    loadData("google.com");

    root = new BorderPane();
    root.setPrefSize(1024, 768);
    root.setTop(hBox);
    root.setCenter(view);


    tab.setContent(root);
    return tab;
}


public void loadData(String URL) {
    if(!URL.startsWith("http://")) {
        URL = "http://" + URL;
    }
    field.setText(URL);
    tab.setText(URL);
    engine.load(URL);

}

private String getTitle() {
    Document doc = engine.getDocument();
    NodeList heads = doc.getElementsByTagName("head");
    String titleText = engine.getLocation() ; // use location if page does not define a title
    if (heads.getLength() > 0) {
        Element head = (Element)heads.item(0);
        NodeList titles = head.getElementsByTagName("title");
        if (titles.getLength() > 0) {
            Node title = titles.item(0);
            titleText = title.getTextContent();
        }
    }
    return titleText;
}

private String goBack() {
    final WebHistory history = engine.getHistory();
    ObservableList<WebHistory.Entry> entryList = history.getEntries();
    int currentIndex=history.getCurrentIndex();

    Platform.runLater(() -> history.go(-1));
    return entryList.get(currentIndex>0?currentIndex-1:currentIndex).getUrl();
}

private String goForward() {
    final WebHistory history = engine.getHistory();
    ObservableList<WebHistory.Entry> entryList=history.getEntries();
    int currentIndex=history.getCurrentIndex();

    Platform.runLater(() -> history.go(1));
    return entryList.get(currentIndex<entryList.size()-1?currentIndex+1:currentIndex).getUrl();
    }
}

1 个答案:

答案 0 :(得分:0)

删除getInstance(jBrowser)方法

使构造函数公开。

然后将标签添加到tabPane中 tabPane.getTabs().add(new JTab(jBrowser).addTab());