Java Lambda开发JavaFX菜单遇类型匹配错误,求排查方向
嘿,我来帮你梳理下这个问题的排查方向,你遇到的这个泛型错误看起来是事件处理的类型匹配出了问题,咱们一步步来排查:
检查MouseEvent的导入是否正确
Java里有两个不同的MouseEvent类:一个是AWT的java.awt.event.MouseEvent,另一个是JavaFX专用的javafx.scene.input.MouseEvent。你用的是JFXHamburger(JFoenix组件),必须导入JavaFX的MouseEvent才行。如果导错了AWT的版本,就会出现这种类型不兼容的泛型错误。赶紧看看你的import语句是不是import javafx.scene.input.MouseEvent;。确认JFoenix与JavaFX的版本兼容性
JFoenix是基于JavaFX的UI库,不同版本的JFoenix对JavaFX的版本有要求。比如你代码里打印了Java版本,如果是Java 11+,就得找对应支持该JavaFX版本的JFoenix包(比如JFoenix 11.0.0对应JavaFX 11)。版本不匹配很容易导致泛型推断、组件API的奇怪错误,建议核对下JFoenix版本与当前JavaFX版本的适配关系。尝试用匿名内部类替代Lambda表达式
有时候编译器的泛型推断会因为上下文或者库的问题出错,你可以把Lambda换成显式的EventHandler匿名内部类试试,看看能不能绕过这个错误:fxHamburger.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { menuTask.setRate(menuTask.getRate() * -1); menuTask.play(); if (fxDrawer.isShown()) { fxDrawer.close(); } else { fxDrawer.open(); } } });如果这样写不报错,那就是Lambda的泛型推断问题,可能是编译器版本或者库的小bug导致的,用匿名内部类可以临时解决,后续再升级库或者编译器版本试试。
清理IDE缓存并重新编译
有时候IDE的缓存会抽风,导致明明代码没问题却报奇怪的编译错误。比如在IntelliJ里可以点击File -> Invalidate Caches... -> Invalidate and Restart,Eclipse里可以Project -> Clean,然后重新编译项目,说不定错误就消失了。
附上你提供的代码方便参考:
@FXML private JFXHamburger fxHamburger; @FXML private JFXDrawer fxDrawer; @Override public void initialize(URL url, ResourceBundle rb) { System.out.println(System.getProperty("java.version")); HamburgerBackArrowBasicTransition menuTask = new HamburgerBackArrowBasicTransition(fxHamburger); menuTask.setRate(-1); fxHamburger.addEventHandler(MouseEvent.MOUSE_PRESSED, (e) -> { menuTask.setRate(menuTask.getRate() * -1); menuTask.play(); if (fxDrawer.isShown()) { fxDrawer.close(); }else{ fxDrawer.open(); } }); }
内容的提问来源于stack exchange,提问作者mazeyarr

