我对JavaFX世界还很陌生,而且似乎无法弄清楚如何在HTMLEditor组件中侦听文本修改事件。

我需要这个,因为我将这个小部件挂接到需要更新的模型上。

具有addEventFilter事件类型的KeyEvent.KEY_TYPED API似乎无法正常工作。调用其处理程序时,getHTMLText()不会使用最新字符进行更新(如果有人不理解本段,我将提供一个分步示例)。

TextField具有textProperty(),可以在其上附加侦听器。
现在,HTMLEditor呢?

另外,最好只在文本修改事件上(而不是在CTRL + A上)调用侦听器。您知道...就像SWT Text的addModifyListener()

最佳答案

在我的一个项目应用程序中使用JavaFX HTMLEditor时,我也遇到了类似的情况。我最后添加了一个button,单击该按钮将进行HTML文本的解析,并执行其他任务。使用AnchorPane,我可以在HTMLEditor上无缝添加button,它看起来像是其中的一部分。

无论如何,这是一个无需任何额外按钮即可实现所需目标的小例子:

package application;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.web.HTMLEditor;
import javafx.stage.Stage;

public class Main extends Application
{
  @Override
  public void start(Stage primaryStage)
  {
    try
    {
      final HTMLEditor editor = new HTMLEditor();
      Scene scene = new Scene(editor);
      primaryStage.setScene(scene);

      editor.setOnKeyReleased(new EventHandler<KeyEvent>()
      {
        @Override
        public void handle(KeyEvent event)
        {
          if (isValidEvent(event))
          {
            System.out.println(editor.getHtmlText());
          }
        }

        private boolean isValidEvent(KeyEvent event)
        {
          return !isSelectAllEvent(event)
              && ((isPasteEvent(event)) || isCharacterKeyReleased(event));
        }

        private boolean isSelectAllEvent(KeyEvent event)
        {
          return event.isShortcutDown() && event.getCode() == KeyCode.A;
        }

        private boolean isPasteEvent(KeyEvent event)
        {
          return event.isShortcutDown() && event.getCode() == KeyCode.V;
        }

        private boolean isCharacterKeyReleased(KeyEvent event)
        {
          // Make custom changes here..
          switch (event.getCode())
          {
            case ALT:
            case COMMAND:
            case CONTROL:
            case SHIFT:
              return false;
            default:
              return true;
          }
        }
      });

      primaryStage.show();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args)
  {
    launch(args);
  }
}


更新:
经过一番思考,我找到了一种即使单击这些按钮也可以完成事件处理的方法。这是如何做:

EventHandler<MouseEvent> onMouseExitedHandler = new EventHandler<MouseEvent>()
{
  @Override
  public void handle(MouseEvent event)
  {
    System.out.println(editor.getHtmlText());
  }
};

for (Node node : editor.lookupAll("ToolBar"))
{
  node.setOnMouseExited(onMouseExitedHandler);
}


如果看到HTMLEditor,它有两个ToolBars
我在代码中所做的是为这两个工具栏设置looking up,并设置了一个onMouseExited事件处理程序。打个比方,如果用户在HTML文本上输入并进行一些更改并退出工具栏,则将触发一个事件,然后可以对其进行处理。

您甚至可以根据需要在这两个工具栏上设置不同类型的事件处理程序,但我认为,这些onMouseExited事件处理程序与onKeyReleased事件处理程序一起使用时,提供了非常广泛的覆盖范围。但是基于onMouseExited处理程序的覆盖范围并不确切。

10-08 12:20