JavaFX HTMLEditor 文本更改监听器

标签 java javafx javafx-2

我对 JavaFX 世界相当陌生,我似乎不知道如何监听 HTMLEditor 组件中的 text-modify 事件。

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

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

TextField 有一个可以附加监听器的 textProperty()
现在 HTMLEditor 怎么样?

此外,最好仅在文本修改事件上调用监听器(例如,不要在 CTRL+A 上调用)。您知道...就像 SWT Text 的 addModifyListener()

最佳答案

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

无论如何,这里有一个小例子,说明如何无需任何额外的按钮即可实现您想要的目标:

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,它有两个 ToolBar
我在代码中所做的就是查找这两个工具栏,并设置一个onMouseExited事件处理程序。类比是,如果用户输入 HTML 文本并对其进行一些更改并退出工具栏,则会触发一个事件,然后可以处理该事件。

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

关于JavaFX HTMLEditor 文本更改监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22128153/

相关文章:

java - 包含 facebook sdk 后的 Gradle 错误

java - Cloud Foundry 数据源oracle JDBC超时为什么?

创建按钮时 JavaFX 场景失去颜色

JavaFX InvalidationListener 或 ChangeListener

java - 如何在 java 中以相同的顺序打乱两个数组

java - IntelliJ 中自定义逗号优先格式的设置

java - 仅对表格 View 中的一个单元格着色

java - 是否可以在 iOS、Android 或 Windows Phone 8 上运行 JavaFX 应用程序?

css - JavaFX - 无法从元素内加载图像

javafx-2 - Javafx PropertyValueFactory 不填充 Tableview