首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有java sdk 12的JFXTextField的IllegalAccessException

带有java sdk 12的JFXTextField的IllegalAccessException
EN

Stack Overflow用户
提问于 2019-04-29 06:50:20
回答 1查看 0关注 0票数 0

我在我的javafx应用程序中添加了JFXTextField,但是我得到了这个错误,并不知道如何解决它

class com.jfoenix.skins.JFXTextFieldSkin (in module com.jfoenix) cannot access a member of class javafx.scene.control.skin.TextFieldSkin (in module javafx.controls) with modifiers "private"

控制器:

代码语言:javascript
复制
package sample;

import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXTextField;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {

@FXML
private Button clickMe;


@FXML
private JFXButton materialButton;

@FXML
private JFXTextField textField;


@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

    materialButton.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent actionEvent)
        {
            String text = textField.getText().trim();
            System.out.println(text);
        }
    });

}
}

Sample.fxml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #fcda;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Button fx:id="clickMe" layoutX="198.0" layoutY="188.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="225.0" style="-fx-background-color: #fffe;" text="Click Me" textFill="#722929" />
      <JFXButton fx:id="materialButton" layoutX="231.0" layoutY="82.0" prefHeight="54.0" prefWidth="139.0" style="-fx-background-color: #ffff;" textFill="#280c0c">
         <font>
            <Font size="25.0" />
         </font></JFXButton>
      <JFXTextField fx:id="textField" layoutX="233.0" layoutY="24.0" promptText="Enter UserName" />
   </children>
</AnchorPane>
EN

回答 1

Stack Overflow用户

发布于 2019-04-29 16:14:46

JFoenix的问题跟踪器已经有这个问题了:

对于初学者来说,JFoenix还没有为Java 11+做好准备。发布的版本适用于Java 9,但它仍适用于Java 11和JavaFX 11,允许您添加JavaFX依赖项。

但是,在JDK 12下它无法运行,问题与JavaFX无关:即使使用JavaFX 11.0.2,它仍然会失败。

该问题与使用反射访问以下Text节点有关TextFieldSkin

代码语言:javascript
复制
textNode = ReflectionHelper.getFieldContent(TextFieldSkin.class, this, "textNode");
代码语言:javascript
复制
java.lang.IllegalAccessException: class com.jfoenix.adapters.ReflectionHelper (in module com.jfoenix) cannot access a member of class javafx.scene.control.skin.TextFieldSkin (in module javafx.controls) with modifiers "private"
        at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:355)
        at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:639)
        at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075)
        at java.base/java.lang.reflect.Field.get(Field.java:416)
        at com.jfoenix/com.jfoenix.adapters.ReflectionHelper.getFieldContent(ReflectionHelper.java:98)
        at com.jfoenix/com.jfoenix.skins.JFXTextFieldSkin.<init>(JFXTextFieldSkin.java:59)

虽然这在Java 11之前运行良好,但使用Java 12时,回归可以防止这种情况发生,并导致这种情况发生textNode = null

看起来这个bug已经解决了,但是还没有公开版本(所以它可能可用于12.0.2或直接用于13,除非它没有向后移植)。

目前这意味着坚持使用JDK 11。

或者,您可以尝试构建自己的JFoenix版本,克隆repo(分支9.0.0)并进行必要的更改以使其适用于JavaFX 11+(超出此答案的范围......),并删除使用尽可能的反思。

例如,textNode可以直接检索:

代码语言:javascript
复制
textNode = textPane.getChildren().get(1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档