Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface JavaFX2——设置defaultButton属性:互斥?_User Interface_Javafx 2_Javafx - Fatal编程技术网

User interface JavaFX2——设置defaultButton属性:互斥?

User interface JavaFX2——设置defaultButton属性:互斥?,user-interface,javafx-2,javafx,User Interface,Javafx 2,Javafx,在Visual Basic 6中,如果将表单按钮控件的DefaultButton属性设置为true,则表单中所有其他按钮控件上的同一属性将设置为false,即该属性是互斥的(如单选按钮) 我在GUI上看到的行为似乎表明JavaFX中的多个按钮可能将defaultButton属性设置为true,并且多个按钮将从系统接收VK_Enter按钮事件 setDefaultButton()方法和defaultButton属性的JavaFX2.2文档没有阐明这个问题 我有一个主播面板和一组控件,还有一个单独的

在Visual Basic 6中,如果将表单按钮控件的DefaultButton属性设置为true,则表单中所有其他按钮控件上的同一属性将设置为false,即该属性是互斥的(如单选按钮)

我在GUI上看到的行为似乎表明JavaFX中的多个按钮可能将defaultButton属性设置为true,并且多个按钮将从系统接收VK_Enter按钮事件

setDefaultButton()方法和defaultButton属性的JavaFX2.2文档没有阐明这个问题

我有一个主播面板和一组控件,还有一个单独的一组控件。这些都显示在同一阶段,用户可以看到哪一个取决于他使用的信息

我想知道是否需要遍历活动窗格上的按钮控件,并将所有控件的defaultButton属性设置为false,然后再将其设置为true,以避免多个按钮接收Enter键事件导致的奇怪行为

编辑2013年5月5日——这是我的ChangeListener代码。我最初是作为一个匿名的内部类编写的,直接附加到TextField控件txtDx的focusedProperty。然而,我想也许我可以通过在我不想让侦听器启动的时候(即,当其窗格不可见或被禁用时)删除侦听器来修复我的错误。因此,我将侦听器移动到一个内部类,并使用实例变量引用它的一个实例。拥有引用允许我根据显示的窗格添加和删除侦听器

无论如何,下面是Listener类:

private class FocusPropertyChangeListener implements ChangeListener<Boolean> {

    FocusPropertyChangeListener() { System.out.println("New FPCL instance"); }

    @Override
    public void changed(ObservableValue<? extends Boolean> ov, 
        Boolean oldb, Boolean newb) {
        System.out.println("Focus change triggered");

        if (ancEncEditor.isVisible() && !ancEncEditor.isDisabled()) {
            boolean b = (newb != null && newb.booleanValue() == true);
            System.out.println("txtDx focus change event triggered: DxAdd = " + b);

            btnWindowCommit.setDefaultButton(!b);
            btnWindowClose.setCancelButton(true);
            btnDxAdd.setDefaultButton(b);
        }
    }
}
编辑2013年5月5日——我修改了代码,这样我就不会再清除defaultButton以前的设置,即只调用一次setDefaultButton(true)。其想法是,由于支持代码使用可运行的执行此操作,-也许-这就是我得到ConcurrentModificationException的原因

因此,现在看来,事实上,当我尝试在btnDxAdd和btnWindowCommit之间切换为默认按钮时,我不再能够在代码中触发ConcurrentModificationException

然而


我也不再能够得到我想要的行为。当我现在在txtDx控件中编辑时,我可以整天按Enter键,并且按钮不会触发。我已经确认我的focusProperty ChangeListener已启动,并且对txtDx.setDefaultButton(true)进行了一次调用。无论如何,我无法获得我想要的行为。

关于javadoc澄清的错误:javafx-jira.kenai.com/browse/RT-30200

关于实现的错误:

我观看了skin类的代码,可以从OpenJFX中看到:

设置默认值(真/假)时发生的情况:


工作原理:当您将“新建”按钮设置为默认值时,它将查找现有的默认按钮,并在按ENTER键时从存储在场景中的acelerators列表中删除acelerator。并将其自身添加为默认按钮。因此,您不需要在其他按钮上设置默认值。

提交了一个关于javadoc澄清的问题:感谢分享您的研究成果。每当我尝试在我的应用程序中运行更改setDefaultButton()和setCancelButton()值的代码,以响应连接到文本字段FocusedProperty的ChangeListener()上的事件时,我就会收到ConcurrentModificationException。由于我没有并发性,也没有迭代集合,甚至在我的应用程序中也没有生成异常的哈希表,所以我必须得出结论,JavaFX在某种程度上受到了错误。我现在不得不从我的应用程序中删除这段代码(没有ChangeListener,它可以正常工作)。这就是为什么我真的讨厌UI设计。似乎,这种修改异常是由于对集合进行某种迭代而产生的,我们试图从中删除smth。我无法使用1个按钮、1个文本字段和对change listener中的默认值进行操作来重现这个问题。你能附上一段代码吗,或者就此提出一个问题?我用了8.0B87同意。这没什么我能控制的,所以我无法修复它。。。我已经浪费了好几个小时来确保我没有收到可重入事件调用,并且错误与设置禁用或不可见控件的属性无关。我将尝试将代码更改为只执行一个setDefaultButton(true),而不是首先尝试将其他设置重置为false。。。。根据您的研究,可能是我在API中创建了多个属性设置线程导致了错误。不过,我认为情况并非如此。我想提供一些代码。我的应用程序使用一个阶段和两个窗格。显示的窗格取决于上下文,每个窗格都有自己的一组默认按钮。但是,在一个窗格中有一个文本字段,我希望在编辑该字段时使用不同的defaultButton(窗格的其余部分使用其基本defaultButtons);因此,FocusedProperty事件。如果我能找到一种用代码简洁地展示设计的方法,我会发布它。
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:894)
at java.util.HashMap$EntryIterator.next(HashMap.java:934)
at java.util.HashMap$EntryIterator.next(HashMap.java:932)
at com.sun.javafx.collections.ObservableMapWrapper$ObservableEntrySet$1.next(ObservableMapWrapper.java:560)
at com.sun.javafx.collections.ObservableMapWrapper$ObservableEntrySet$1.next(ObservableMapWrapper.java:548)
at com.sun.javafx.scene.KeyboardShortcutsHandler.processAccelerators(KeyboardShortcutsHandler.java:286)
at com.sun.javafx.scene.KeyboardShortcutsHandler.dispatchBubblingEvent(KeyboardShortcutsHandler.java:119)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$KeyHandler.process(Scene.java:3513)
at javafx.scene.Scene$KeyHandler.access$2300(Scene.java:3472)
at javafx.scene.Scene.impl_processKeyEvent(Scene.java:1904)
at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2270)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:136)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:100)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:163)
at com.sun.glass.ui.View.handleKeyEvent(View.java:518)
at com.sun.glass.ui.View.notifyKey(View.java:951)
at com.sun.glass.ui.win.WinApplication._enterNestedEventLoop(Native Method)
at com.sun.glass.ui.Application.enterNestedEventLoop(Application.java:383)
at com.sun.glass.ui.EventLoop.enter(EventLoop.java:83)
at com.sun.javafx.tk.quantum.QuantumToolkit.enterNestedEventLoop(QuantumToolkit.java:520)
at javafx.stage.Stage.showAndWait(Stage.java:397)
at org.kls.md.censusassistant.DialogController.showAndWait(DialogController.java:94)
at org.kls.md.censusassistant.DCMainEditor.handleEncDetails(DCMainEditor.java:287)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:279)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Node.fireEvent(Node.java:6863)
at javafx.scene.control.Button.fire(Button.java:179)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336)
at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
at javafx.event.Event.fireEvent(Event.java:171)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3328)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3168)
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3123)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1563)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2265)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)
at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
at com.sun.glass.ui.View.notifyMouse(View.java:922)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Thread.java:722)
Runnable defaultButtonRunnable = new Runnable() {
        public void run() {
            if (!getSkinnable().isDisabled()) {
                getSkinnable().fire();
            }
        }
    };

private void setDefaultButton(boolean value) {

    KeyCode acceleratorCode = KeyCode.ENTER;
    defaultAcceleratorKeyCodeCombination = 
            new KeyCodeCombination(acceleratorCode);

    if (! value) {
        /*
        ** first check of there's a default button already
        */
        Runnable oldDefault = getSkinnable().getParent().getScene().getAccelerators().get(defaultAcceleratorKeyCodeCombination);
        if (!defaultButtonRunnable.equals(oldDefault)) {
            /*
            ** is it us?
            */
            getSkinnable().getParent().getScene().getAccelerators().remove(defaultAcceleratorKeyCodeCombination);
        }
    }
    getSkinnable().getParent().getScene().getAccelerators().put(defaultAcceleratorKeyCodeCombination, defaultButtonRunnable);
}