【问题标题】:Calling methods from other classes in FXML controller从 FXML 控制器中的其他类调用方法
【发布时间】:2014-04-08 23:47:25
【问题描述】:

我目前正在做作业,使用场景构建器在 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 文件,该文件将创建新选项卡并具有返回当前 Web 引擎的方法,因此我可以实现所有这些功能。

问题是,当我创建一个新类时,我无法从控制器访问它,我不断收到错误消息。例如,如果我有一个名为 BrowserTab 的新文件和一个名为 newBrowserTab 的方法,那么我如何使用我的所有其他代码从控制器文件中调用该方法。我想它会是这样的:

BrowserTab.newBrowserTab(tabPane, "New Tab")

【问题讨论】:

    标签: java controller javafx fxml scenebuilder


    【解决方案1】:

    请参阅static methods 以获得快速解决方案。

    静态方法是最直接的,但不是非常面向对象的。 passing object instances around to FXML controllers 的其他方法不涉及静态方法,提供更好的封装、实例化、多态支持等,全局状态更少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多