非静态方法getHostServices()不能从静态上下文中引用

时间:2014-02-10 19:38:36

标签: java javafx-2 javafx-8

我有这个调用电子邮件客户端的JavaFX代码

        MenuItem ri = new MenuItem("Report Issue");

        // Start E-Mail Client with E-Mail template and send E-Mail
        ri.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {


                Application.getHostServices().showDocument("mailto:"+textField.getText());



            }
        });

我在Netbeans non-static method getHostServices() cannot be referenced from a static context

中收到消息

你能告诉我如何解决这个问题吗?

P.S这是我可以创建的解决方案:

ri.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {

                Application a = new Application() {

                    @Override
                    public void start(Stage stage)
                    {
                    }
                };
                final TextField textField = new TextField("help@example.com");
                a.getHostServices().showDocument("mailto:"+textField.getText());

            }
        });

有更好的建议吗?

5 个答案:

答案 0 :(得分:2)

看起来像getHostServices()不是Application类或其子类中定义的静态方法。

答案 1 :(得分:1)

最好的方法是实例化您的Application类以在非静态上下文中使用该方法:

申请a =新申请();
。a.getHostServices()showDocument( “电子邮件地址:” + textField.getText());

或者如果要在静态上下文中运行此程序,请更改getHostServices()方法:

public void getHostServices(){...}
 对于像 public static void getHostServices(){...}

(编辑) 正如詹姆斯指出我的回答是FX的无稽之谈;你不能修改应用程序,并且实例化没有任何意义。 如果您的程序扩展了Application,那么尝试简单地删除“Application”。从您的第一个代码开始,因为您的程序继承了getHostServices()方法。

答案 2 :(得分:1)

我以这种方式使用代码:

public class App extends Application {
    private static App mInstance;
    public static void main(String[] args) throws Exception { launch(args); }

    public static App getInstance() {
        return mInstance;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        // your code
    }
}

你可以在你的应用中的任何地方获取它

HostServices services = App.getInstance().getHostServices();
services.showDocument(url);

答案 3 :(得分:0)

如果getHostServices符合您的设计要求,或者安排从非静态方法或块中调用它,那么请将其设为静态方法。

答案 4 :(得分:0)

假设您的电子邮件超链接是:

@FXML
private Hyperlink emailLink;

然后在您的控制器类中,您可以添加(使用lambda):

@Override
    public void initialize(URL arg0, ResourceBundle arg1) {

        emailLink.setOnAction(t -> {
            Application application = new Application() {
                @Override
                public void start(Stage primaryStage) throws Exception {

                }
            };
            application.getHostServices().showDocument("mailto:"+textField.getText()");
        });
    }