【问题标题】:Write text on textarea at mouse coordinates在鼠标坐标处的 textarea 上写入文本
【发布时间】:2021-12-28 20:42:18
【问题描述】:

我正在尝试创建类似于 MS Paint 的东西,我需要一个可以单击场景并立即能够在我单击的位置书写的功能。我从这个Anwser 中提取了整个代码示例来解决如何在canvastextarea 之间切换。换句话说,如何在“绘图”和“写作”模式之间切换。所以目前我可以画和写 Current progress ,但我的问题是我想在我点击 textarea 而不是在行的开头写文本。 这就是我的想象 (Goal)。

所以我想添加一个处理程序,它可以提供鼠标坐标并将插入符号设置到该位置:

textarea.setOnMouseClicked(event->{
        textarea.positionCaret();
    });

只意识到positionCaret() 只需要1个参数。 因此,我无法将“插入符号”定位到鼠标单击的 x、y 位置。 所以问题是如何将“插入符号”/光标移动到我的textarea 中的任何给定位置?

【问题讨论】:

  • "我只找到 textarea.caretPosition(int i)" -> 你在哪里找到的?你能链接到源吗?这甚至不是 JavaFX API。如果你想获得当前插入符号的位置,你可以调用get caret position,同样是一个setter。你想“在鼠标坐标的文本区域上写文本”,但我不知道这是什么意思。请编辑问题以更好地解释您想要做什么并提供minimal reproducible example。画布完全不相关......
  • 我的坏小扭蛋。我的意思是 positonCaret(int i)。还尝试编辑我的问题,但我不知道这是否更好。
  • 比较好,现在可以理解了。请考虑在需要时提供minimal reproducible example

标签: javafx


【解决方案1】:

解释插入符号的定位以及为什么它与您的目的无关

您误解了 JavaFX 文本输入的插入符号位置相关 API 的概念。 API 与屏幕坐标无关。它们指的是插入符号相对于文本输入字段中的文本的位置。

假设您有以下单词:

happy
  • 插入符号位置 0 将插入符号定位在 h 之前。
  • 插入符号位置 3 将插入符号定位在两个 ps 之间。

插入符号定位后。如果有人开始输入,新文本将插入到插入符号处。

如果你这样做:

setCaretPositon(3)

然后你输入haphap,那么文字会变成:

haphaphappy

如果有人在可编辑的文本字段中单击,JavaFX 系统足够智能,可以默认处理单击,将插入符号放置在最接近单击的字母旁边(并处理选择和其他任务)。您无需编写任何代码即可获得该功能。

所以插入符号 API 与您要完成的任务无关。

文本(或任何其他节点)的绝对定位

如果您想在鼠标单击时为文本输入字段定义一个绝对位置,那么您可以使用与在 JavaFX 中定位任何节点完全相同的方式来执行此操作,即使用节点布局函数。具体来说,您设置节点的 x 和 y 坐标。坐标系和相关 API 在Node javadoc 中有说明。要同时设置 x 和 y 值,请调用 relocate 方法。

单击鼠标时在窗格中定位可编辑文本的示例

这里是一个例子,它生成一个新的文本区域,并将新文本区域的左上角定位在鼠标点击的位置。

Pane pane = new Pane();

pane.setOnMouseClicked(event -> {
    if (event.getTarget() == pane) {
        TextArea newTextArea = new TextArea();
        newTextArea.relocate(
                event.getX(), 
                event.getY()
        );
        pane.getChildren().add(
                newTextArea
        );
    }
});

该示例使用Pane,因为它是一个不会将布局定位应用到其子节点的父节点(与 StackPane 不同,它将覆盖您设置的任何布局值并应用其自己的布局算法,默认情况下,它将将节点置于其父节点的中心)。

您可以在以下答案的上下文中看到更全面的示例:

该示例将在单击时在 Label 和 TextField 之间转换文本,以允许编辑标签值。您可以选择在您的绘图程序中使用此类功能,或者您可以按照 MS Paint 的方式进行操作。

如何模拟 MS Paint

MS Paint 所做的是允许您最初编辑文本,但是一旦您按下回车键提交编辑,它就会对文本进行快照并将其绘制为画布上的图像,将其从节点类型对象转换为位在画布上。此后,您将无法再直接编辑文本。如果你想这样做,你可以使用节点snapshot 函数和图形上下文drawImage 函数的组合。如果您进行快照,请确保在SnapshotParameters 中正确设置背景,使其透明,这样文本背景就不会覆盖您的绘图(或者如果您愿意,可以将背景设置为适当的颜色覆盖)。

目前我不会在此处提供此类功能的完整代码。

样式化文本输入

您可能想要设置(使用 CSS)文本输入字段的样式以获得您想要的外观。可编辑标签示例提供了一些有关如何执行此操作的提示,但您可能希望您的应用使用不同的样式。具体来说,文本输入的默认样式将有一个框和背景,您可能想要也可能不想要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多