我似乎对IntelliJ有一个关于setOnAction
lambda函数的问题。经过大量研究,我找不到解决问题的答案。
我正在学习用Java编程(最新的JDK 8版本),最近从NetBeans转到IntelliJ IDE。我编写了一个非常简单的程序,该代码在NetBeans中可以正常运行,但是在使用IntelliJ时遇到了问题。
IntelliJ无法识别setOnAction
函数。我已经配置了IDE(项目结构/模块/,并选择8-Lambda,键入注释,...),但是没有成功。我手动添加了:import javafx.event.ActionEvent;
我还进行了配置(设置/常规/自动导入/即时添加明确的导入)。
程序包含两个类,一个Main类和一个GUI类。
主类:
package fxvb0203;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
public class fxvb0203 extends Application
{
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage)
{
FlowPane root = new FlowPane();
Scene scene = new Scene(root);
new GUI(root);
primaryStage.setTitle("Test");
primaryStage.setScene(scene);
primaryStage.show();
}
}
GUI类:
package fxvb0203;
import javafx.scene.layout.FlowPane;
import javafx.event.ActionEvent;
import java.awt.*;
public class GUI
{
private final Button btnText = new Button("Text");
private final TextField txtField = new TextField();
public GUI(FlowPane pane)
{
btnText.setOnAction(event ->
{
txtField.setText("text");
});
pane.getChildren().add(btnText);
pane.getChildren().add(txtField);
}
}
setOnAction
给出以下警告:
can not resolve method setOnAction, (lambda expression)
import javafx.event.ActionEvent;
因为未使用而呈灰色,这很奇怪。因此,使用IntelliJ一定是不正确的。
我只有IntelliJ的另一个小问题是,它与主要问题无关,如下:
pane.getChildren().add(btnText);
pane.getChildren().add(txtField);
这两行代码给出以下错误:
add (javafx.scene.Node) in list cannot be applied to (java.awt.TextField)
在NetBeans中,两者都可以正常工作,但是IntelliJ会带来问题。
我希望依靠这个社区的专业帮助,因为我有点被困在这里,除了这些小问题之外,我真的很喜欢IntelliJ IDE。
非常感谢。
问候。
答案 0 :(得分:3)
在您的GUI
类中,您具有以下导入语句:import java.awt.*;
。 *
表示您正在导入java.awt
包中的所有内容,其中包括java.awt.TextField
,java.awt.Button
和{{1 }}。
这意味着,实际上java.awt.ActionEvent
不是btnText
是javafx.scene.control.Button
,而是java.awt.Button
。 AWT Button
没有setOnAction
方法,因此您遇到编译错误。这也会影响您的txtField
,现在是java.awt.TextField
而不是javafx.scene.control.TextField
。
用import java.awt.*
和import javafx.scene.control.Button
替换import javafx.scene.control.TextField
; 或替换为import javafx.scene.control.*
。
如果故意导入java.awt.*
,通常将不同的GUI工具包混合在一起是一个坏主意。