0

在侦听器中,当我检测到树视图中的双击时,由于某种原因,我无法接收代码区域的插入符号边界。说这话有点不对劲->

    Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: This ParagraphText is not the parent of the given shape (CaretNode(name=main-caret position=41 paragraphIndex=2 columnPosition=0 Path[elements=[MoveTo[x=0.0, y=0.0], LineTo[x=0.0, y=17.0]], fill=null, fillRule=NON_ZERO, stroke=0x000000ff, strokeWidth=1.0])):
Expected: ParagraphText@1172582503(paragraph=Par[[]; StyledSegment(segment= style=[])])
Actual:   null
    at org.fxmisc.richtext.ParagraphText.checkWithinParagraph(ParagraphText.java:311)
    at org.fxmisc.richtext.ParagraphText.getCaretBoundsOnScreen(ParagraphText.java:256)
    at org.fxmisc.richtext.ParagraphBox.getCaretBoundsOnScreen(ParagraphBox.java:214)
    at org.fxmisc.richtext.GenericStyledArea.lambda$getCaretBoundsOnScreen$26(GenericStyledArea.java:1199)
    at java.base/java.util.Optional.map(Optional.java:258)
    at org.fxmisc.richtext.GenericStyledArea.getCaretBoundsOnScreen(GenericStyledArea.java:1199)
    at org.fxmisc.richtext.CaretNode.lambda$new$6(CaretNode.java:232)
    at org.reactfx.value.Val$3.computeValue(Val.java:722)
    at org.reactfx.value.ValBase.getValue(ValBase.java:17)
    at org.reactfx.value.SuspendableValWrapper.getValue(SuspendableValWrapper.java:23)
    at org.fxmisc.richtext.CaretNode.getCaretBounds(CaretNode.java:103)
    at org.fxmisc.richtext.CaretSelectionBindImpl.getCaretBounds(CaretSelectionBindImpl.java:60)
    at org.fxmisc.richtext.TextEditingArea.getCaretBounds(TextEditingArea.java:101)
    at application.Main$40.changed(Main.java:3577)
    at application.Main$40.changed(Main.java:1)
    at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
    at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
    at org.reactfx.SuspendableBase.resume(SuspendableBase.java:64)
    at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
    at org.reactfx.MultiGuard.close(Guard.java:83)
    at org.reactfx.Suspendable$1.resumeSource(Suspendable.java:118)
    at org.reactfx.Suspendable$1.suspendSource(Suspendable.java:104)
    at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
    at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
    at org.reactfx.EventStreams$3.lambda$observeInputs$0(EventStreams.java:105)
    at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
    at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
    at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
    at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
    at org.reactfx.SuspendableBoolean.release(SuspendableBoolean.java:24)
    at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
    at org.reactfx.Suspendable.suspendWhile(Suspendable.java:49)
    at org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.updateMulti(GenericEditableStyledDocumentBase.java:218)
    at org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.updateSingle(GenericEditableStyledDocumentBase.java:210)
    at org.reactfx.util.Tuple3.exec(Tuple3.java:43)
    at org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.replace(GenericEditableStyledDocumentBase.java:145)
    at org.fxmisc.richtext.model.SimpleEditableStyledDocument.replace(SimpleEditableStyledDocument.java:10)
    at org.fxmisc.richtext.GenericStyledArea.replace(GenericStyledArea.java:1470)
    at org.fxmisc.richtext.GenericStyledArea.replaceText(GenericStyledArea.java:1457)
    at org.fxmisc.richtext.EditActions.insertText(EditActions.java:39)
    at org.fxmisc.richtext.EditActions.appendText(EditActions.java:15)
    at application.Main.lambda$72(Main.java:3682)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
    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.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$ClickGenerator.postProcess(Scene.java:3563)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3865)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1851)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2584)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    at javafx.graphics/com.sun.glass.ui.mac.MacView.notifyMouse(MacView.java:127)

当我在显示弹出窗口时调用 getCaretBounds 时,我的代码出错了。我不完全理解这个错误。根据研究,我认为 setOnMouseClicked 是主要问题,但我不知道如何解决此问题。先感谢您!

    tv.setOnMouseClicked(e -> {
            if (e.getClickCount() == 2 && ((TreeItem<String>) tv.getSelectionModel().getSelectedItem()).getValue().contains(".")) {
              //this method
            }
     }
                codeArea1.textProperty().addListener(new ChangeListener<String>()
                {
                    @Override
                    public void changed(ObservableValue<? extends String> observableValue, String s, String s2) {
                        
                        
                        String curr = "";
                        String currFinal = "";
                        for (int i = codeArea1.getAnchor(); i > 0; i--) {
                            if (codeArea1.getText().charAt(i) == '\n' || codeArea1.getText().charAt(i) == ' ') {
                                break;
                            }else {
                                curr += codeArea1.getText().charAt(i);
                            }
                        }
                        
                        for (int i = curr.length()-1; i >= 0; i--) {
                            currFinal += curr.charAt(i);
                        }
                        
                        if (currFinal != "") {
                            ArrayList<String> fil = new ArrayList<String>();
                            for (int i = 0; i < keyphrases.length; i++) {
                                if (keyphrases[i].contains(currFinal)) {
                                    fil.add(keyphrases[i]);
                                }
                            }
                            if (popup != null) {
                                popup.hide();
                            }
                            if (fil.size() > 0) {
                                lop = new ListView();
                                for (int i = 0; i < fil.size(); i++) {
                                    lop.getItems().add(fil.get(i));
                                }
                                popup = new Popup();
                                lop.setMaxHeight(80);
                                popup.getContent().addAll(lop);
                                
                                //this line is bugging out
                                popup.show(codeArea1, codeArea1.getCaretBounds().get().getMaxX(), codeArea1.getCaretBounds().get().getMaxY());
                                codeArea1.requestFocus();
                            }
                            codeArea1.requestFocus();
                        }else { 
                            if (popup != null) {
                                popup.hide();
                            }
                        }
                    }
                });
            
4

0 回答 0