带有 java sdk 12 的 JFXTextField 的 IllegalAccessException [英] IllegalAccessException for JFXTextField with java sdk 12

查看:21
本文介绍了带有 java sdk 12 的 JFXTextField 的 IllegalAccessException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I added JFXTextField in my javafx application but I got this error with no clue how to solve it

类 com.jfoenix.skins.JFXTextFieldSkin(在模块 com.jfoenix 中)无法访问具有修饰符private"的类 javafx.scene.control.skin.TextFieldSkin(在模块 javafx.controls 中)的成员

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"

控制器:

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);
        }
    });

}
}

示例.fxml

<?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>

推荐答案

此问题已在 JFoenix 的问题跟踪器中报告:

This issue has already been reported at the JFoenix's issue tracker:

对于初学者来说,JFoenix 还没有真正为 Java 11+ 做好准备.已发布的版本适用于 Java 9,但它仍然适用于 Java 11 和 JavaFX 11,前提是您添加了 JavaFX 依赖项.

For starters, JFoenix is not really ready for Java 11+. The released version is intended for Java 9, but it still works with Java 11 and JavaFX 11, providing you add the JavaFX dependencies.

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

However, under JDK 12 it fails to run, and the issue is not JavaFX related: even with JavaFX 11.0.2 it still fails.

问题与reflection 访问TextFieldSkinText节点:

textNode = ReflectionHelper.getFieldContent(TextFieldSkin.class, this, "textNode");

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.0.2 之前运行良好,但在 Java 12 a 回归 unsafe 最近的变化阻止了这个工作,并导致 textNode = null.

While this worked fine up until Java 11.0.2, with Java 12 a regression recent changes in unsafe prevents this from working, and causes textNode = null.

正如@AlanBateman 在下面的评论中提到的:

As @AlanBateman mentions in his comments below:

[JFoenix 维护者] 应该将他们的 setAccessible 方法替换为调用 obj.setAccessible(true) 以便用户在库试图入侵内部时获得正确的异常它无法访问.如果您这样做,那么用户可以使用 --add-exports--add-opens 选项解决这些问题,直到库的维护者解决他们的问题.>

[The JFoenix maintainers] should replace their setAccessible method to call obj.setAccessible(true) so that the user gets the right exceptions when the library tries to hack internals that are not accessible to it. If you do that then the user can workaround those issues with --add-exports or --add-opens options until the maintainers of the library fix their issues.

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

For now this will mean sticking to JDK 11.

或者,您可以尝试构建自己的 JFoenix 版本,克隆存储库(分支 9.0.0)并进行必要的更改以使其与 JavaFX 11+ 一起使用(超出本答案的范围......),并且尽可能去除反射的使用.

Alternatively, you could try to build your own JFoenix version, cloning the repo (branch 9.0.0) and making the necessary changes to make it work with JavaFX 11+ (out of scope of this answer...), and removing the use of reflection where possible.

例如,textNode 可以直接检索:

For instance, the textNode can be directly retrieved with:

textNode = textPane.getChildren().get(1);

或者,仍然依赖反射,但要进行适当的更改:

or, still rely on reflection, but with the proper changes mentioned:

try {
    Field field = cls.getDeclaredField(fieldName);
    field.setAccessible(true); // <-- Use this.
    return (T) field.get(obj);
} catch (Throwable ex) { }

结合:

--add-exports=javafx.controls/javafx.scene.control.skin=$moduleName

这篇关于带有 java sdk 12 的 JFXTextField 的 IllegalAccessException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆