簡體   English   中英

從FXML控制器中的其他類調用方法

[英]Calling methods from other classes in FXML controller

我目前正在做作業,使用場景構建器在javaFX中創建帶有多個選項卡的Web瀏覽器,並在FXML控制器中進行編碼。 我還很新,但是我似乎無法弄清楚如何從控制器類中的其他類訪問其他方法。

我有一個文件名FXMLDocumentController.java,其中所有代碼都在其中,另一個文件名為Name.java,該文件僅加載由場景構建器創建的.fxml文檔。

package name;



public class FXMLDocumentController implements Initializable {

@FXML
private Tab TabPanel1;

@FXML
private Button backButton;

@FXML
private Button forwardButton;

@FXML
private Button goButton;

@FXML
private Label label;

@FXML
private MenuBar menubar1;

@FXML
private Button stopButton;

@FXML
private AnchorPane textArea1;

@FXML
private ComboBox urlAddress;

@FXML
private WebView webview1;
private WebEngine webEngine;

@FXML
void backButtonClickAction(ActionEvent event) {
    WebHistory history = webEngine.getHistory();
    int back = history.getCurrentIndex();
    if (back <= 0) {
    } else {
        history.go(-1);
    }

}

@FXML
void forwardButtonClickAction(ActionEvent event) {
    WebHistory history = webEngine.getHistory();
    int fwd = history.getCurrentIndex();
    fwd++;
    ObservableList<WebHistory.Entry> entryList = history.getEntries();
    int stop = entryList.size();
    if (fwd == stop) {
    } else {
        history.go(1);
    }
}

@FXML
void stopButtonAction(ActionEvent event) {
    webEngine.getLoadWorker().cancel();
}

@FXML
void goButtonAction(ActionEvent event) {
    String url = urlAddress.getValue().toString();
    if (url.startsWith("http://www.")) {
        webEngine.load(url);
    } else if (url.startsWith("www.")) {
        webEngine.load("http://" + url);
    } else {
        webEngine.load("http://www." + url);
    }

    //TabPanel1.setText(webEngine.getLocation());
    //System.out.println(webEngine.getTitle());
}

@FXML
void urlAddressEnter(ActionEvent event) {
    String url = urlAddress.getValue().toString();
    if (url.startsWith("http://www.")) {
        webEngine.load(url);
    } else if (url.startsWith("www.")) {
        webEngine.load("http://" + url);
    } else {
        webEngine.load("http://www." + url);
    }
}

@Override
public void initialize(URL url, ResourceBundle rs) {
    assert TabPanel1 != null : "fx:id=\"TabPanel1\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert backButton != null : "fx:id=\"backButton\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert forwardButton != null : "fx:id=\"forwardButton\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert goButton != null : "fx:id=\"goButton\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert label != null : "fx:id=\"label\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert menubar1 != null : "fx:id=\"menubar1\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert stopButton != null : "fx:id=\"stopButton\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert textArea1 != null : "fx:id=\"textArea1\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert urlAddress != null : "fx:id=\"urlAddress\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    assert webview1 != null : "fx:id=\"webview1\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
    webEngine = webview1.getEngine();
    getHistory();

}

private void getHistory() {
    final WebHistory history = webEngine.getHistory();
    history.getEntries().addListener(new ListChangeListener<WebHistory.Entry>() {
        @Override
        public void onChanged(ListChangeListener.Change<? extends WebHistory.Entry> c) {
            c.next();
            for (WebHistory.Entry e : c.getRemoved()) {
                urlAddress.getItems().remove(e.getUrl());
            }
            for (WebHistory.Entry e : c.getAddedSubList()) {
                urlAddress.getItems().add(e.getUrl());
            }
        }
    });
}

}

這將創建一個帶有后退,前進,停止和歷史記錄下拉列表的瀏覽器。 現在,我需要創建多個選項卡,因此需要創建一個新的.java文件,該文件將創建新的選項卡,並具有返回當前Webengine的方法,因此我可以實現所有這些功能。

問題是,當我創建一個新類時,無法從控制器訪問它,所以我不斷收到錯誤消息。 例如,如果我有一個名為BrowserTab的新文件,並帶有一個名為newBrowserTab的方法,那么如何使用我的所有其他代碼從控制器文件中調用該方法。 我想這將是這樣的:

BrowserTab.newBrowserTab(tabPane, "New Tab")

有關快速解決方案,請參見靜態方法

靜態方法是最簡單的方法,但不是非常面向對象的。 還有其他將對象實例傳遞給FXML控制器的方法,這些方法不涉及靜態方法,而是以較少的全局狀態提供了更多的封裝,實例化,多態性支持等。

暫無
暫無

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

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