AutoCompletionBinding无法访问com.sun.javafx.event.EventHandlerManager类

6
我对javafxorg.controlsfx.control.textfield.TextFields遇到了一些问题。我正在尝试实现一个功能,从数据库中获取可能的用户输入预测,以便用户只能选择“授权”的选项。在使用controlsfx时,我遇到了这个错误。
错误信息:
Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessError: class org.controlsfx.control.textfield.AutoCompletionBinding (in unnamed module @0x239a4ba) cannot access class com.sun.javafx.event.EventHandlerManager (in module javafx.base) because module javafx.base does not export com.sun.javafx.event to unnamed module @0x239a4ba
at org.controlsfx.control.textfield.AutoCompletionBinding.<init>(AutoCompletionBinding.java:521)
at impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding.<init>(AutoCompletionTextFieldBinding.java:107)
at impl.org.controlsfx.autocompletion.AutoCompletionTextFieldBinding.<init>(AutoCompletionTextFieldBinding.java:92)
at org.controlsfx.control.textfield.TextFields.bindAutoCompletion(TextFields.java:187)
at sample.Controller.lambda$listenKey$0(Controller.java:40)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$KeyHandler.process(Scene.java:4058)
at javafx.graphics/javafx.scene.Scene$KeyHandler.access$1500(Scene.java:4004)
at javafx.graphics/javafx.scene.Scene.processKeyEvent(Scene.java:2121)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2595)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:217)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:149)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$1(GlassViewEventHandler.java:248)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:247)
at javafx.graphics/com.sun.glass.ui.View.handleKeyEvent(View.java:547)
at javafx.graphics/com.sun.glass.ui.View.notifyKey(View.java:971)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:834)

我了解到,引用 自从Java Web Start不再是Java SE 11及以上版本的一部分后,我们将不再研究它。。我不知道是因为这个原因还是我做错了什么。
以下是我的代码:
    package sample;
/**
 * Sample Skeleton for 'sample.fxml' Controller Class
 */

import java.net.URL;
import java.util.*;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import org.controlsfx.control.textfield.TextFields;

public class Controller{

    @FXML // ResourceBundle that was given to the FXMLLoader
    private ResourceBundle resources;

    @FXML // URL location of the FXML file that was given to the FXMLLoader
    private URL location;

    // fx:id="inputAutoComplete";
    @FXML
    private TextField inputAutoComplete;

    @FXML // This method is called by the FXMLLoader when initialization is complete
    void initialize() {
        System.out.println("XD");
        listenKey();
    }

    ArrayList<String> possibleWordSet = new ArrayList<>();

    public void listenKey(){
        databaseConnection dbconn = new databaseConnection();
        inputAutoComplete.setOnKeyPressed((event) -> {
            if(inputAutoComplete.getText().length() > 4){
                System.out.println(inputAutoComplete.getText());
                possibleWordSet = dbconn.getSuggestedData(inputAutoComplete.getText());
                System.out.println(possibleWordSet);
                TextFields.bindAutoCompletion(inputAutoComplete,possibleWordSet);
            }
        });
    }
}

有人可以给我一些实现此功能的示例或者告诉我我做错了什么吗?


请使用正确版本的ControlsFX(9)。 - fabian
我正在使用 org.controlsfx:controlsfx:9.0.0 - Wojciech Miśta
5
我找到了一个解决方案! 我需要在VM选项中添加“--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED”。 - Wojciech Miśta
注意:OP发现并在答案中展示的--add-exports VM参数的需求,以及其他变体,已在https://github.com/controlsfx/controlsfx/wiki/Using-ControlsFX-with-JDK-9-and-above文档中记录。 - Slaw
2个回答

6
如果您正在使用ControlsFX 11,请将以下VM选项添加到运行时命令行中:
--add-exports javafx.base/com.sun.javafx.event=org.controlsfx.controls

注意:之前的回答(在其他网站和这里SO上)建议如下:
--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED

然而,最近的ControlFX版本似乎已被模块化,这些模块不再是未命名的。如果你使用的是早期版本(比如第9版),请使用ALL-UNNAMED变体的命令行选项。

这在 module-info.java 文件中看起来怎么样? - SedJ601
@SedJ601 它看起来像 exports com.sun.javafx.event; 或者 exports com.sun.javafx.event to org.controlsfx.controls;。但这将在 javafx.base 的模块描述符中。你不能从自己的模块描述符中修改另一个模块。这就只能使用如上所示的 --add-exports。或者,为了以编程方式实现此操作,你可以构建自己的 ModuleLayer 用于 JavaFX + ControlsFX (+ 你自己的代码),并利用 ModuleLayer.Controller API。或者,你可以分支并构建 JavaFX 自己来添加所需的 exports 指令。 - Slaw
@Slaw,如果我正在使用一个IDE,比如Netbeans,那么我在哪里执行--add-exports javafx.base/com.sun.javafx.event=org.controlsfx.controls命令?我似乎无法在“项目属性”下的“运行->VM选项”中进行编辑。我收到了一条消息,说“/Run/Debug/Profile”操作之一已被修改,因此无法安全地编辑运行面板。 - SedJ601
我刚刚注意到了Wizards的回答。我将尝试它。 - SedJ601

5

如果您使用Maven插件(javafx:run)运行应用程序,并且最终到达了此处,则可以使用以下配置来使其运行。

        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.4</version>
            <configuration>
                <mainClass>some.package.App</mainClass>
                 <options>
                    <option>--add-exports</option>
                    <option>javafx.base/com.sun.javafx.event=org.controlsfx.controls</option>
                 </options>
            </configuration>
        </plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接