gpt4 book ai didi

java - 使用 java sdk 12 的 JFXTextField 的 IllegalAccessException

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:52 26 4
gpt4 key购买 nike

我在我的 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"

Controller :

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>

最佳答案

这个问题已经在 J​​Foenix 的问题跟踪器上报告过:

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

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

此问题与 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 regression 最近对 unsafe 的更改阻止了它的工作,并导致 textNode = null

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

[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。

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

例如,textNode 可以直接检索:

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

或者,仍然依赖于反射,但是提到了适当的改变:

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 - 使用 java sdk 12 的 JFXTextField 的 IllegalAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55889654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com