当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中找到段落(标签)的终点?

漆雕稳
2023-03-14

简单的问题,希望有一个简单的解决方案。我在JavaFX应用程序中有一个标签,我希望在段落的末尾有一个按钮。在这一段的结尾,我的意思是好像它是另一个字符。我无法将X和Y设置为特定值,因为段落的长度并不总是相同的,因此该按钮的位置也不总是相同的。

下面,红色是我想要一个按钮的地方。有没有办法通过编程找到这一点?

谢谢

共有2个答案

汤飞羽
2023-03-14

我认为最简单的方法是创建自己的包装方法,根据可用宽度将段落字符串转换为文本(或标签)对象数组,并将这些对象放在流窗格中,最后有一个按钮。我认为您无法轻松检索标签的实际endpoint坐标,因为它是一个覆盖节点边界的矩形。

类似于本问题中的解决方案,将多个Text对象连接在一起:JavaFX:为Text控件设置背景颜色

寇丰
2023-03-14

您可以使用助手方法将长文本拆分为表示单行文本的节点列表。然后,在将文本添加到流程窗格后,只需在末尾添加按钮即可。

看看下面演示的MCVE:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class TextFlowSample extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        String longText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nibh sapien, commodo in libero ac, feugiat accumsan odio. Aliquam erat volutpat. Integer accumsan sapien at elit aliquet sagittis. Praesent fermentum nec nunc ultrices mollis. Nam in odio ullamcorper, eleifend quam quis, aliquam sem. Nullam feugiat ex nec elit rutrum blandit. Etiam ut mauris magna. Proin est nunc, viverra quis tempus sed, dictum in lacus.";

        // Create a FlowPane to hold our Text
        FlowPane flowPane = new FlowPane();

        // Now, our button
        Button button = new Button("Click This!");

        // Let's use our custom method to get a list of Text objects to add to the FlowPane
        // Here we can set our max length and determine if we'll allow words to be broken up
        flowPane.getChildren().addAll(getTextsFromString(longText, 75, false));
        flowPane.getChildren().add(button);

        root.getChildren().add(flowPane);

        // Show the Stage
        primaryStage.setWidth(425);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    /**
     * Helper method to convert a long String into a List of Text objects
     */
    private List<Text> getTextsFromString(String string, int maxLineLength, boolean breakWords) {

        List<Text> textList = new ArrayList<>();

        // If we are breaking up words, just cut into rows up to the max length
        if (breakWords) {
            int index = 0;
            while (index < string.length()) {
                textList.add(new Text(string.substring(index, Math.min(index + maxLineLength, string.length()))));
                index += maxLineLength;
            }
        } else {

            // First, let's insert linebreaks into the String when max length is reached. The tokenizer here
            // allows us to split the string and keep the spaces, making it easy to loop through later.
            StringTokenizer tokenizer = new StringTokenizer(string, " ", true);
            StringBuilder sb = new StringBuilder();

            int currentLength = 0;
            while (tokenizer.hasMoreTokens()) {
                String word = tokenizer.nextToken();

                // If the next word would exceed our max length, add the new line character
                if (currentLength + word.length() > maxLineLength) {
                    sb.append("\n");
                    currentLength = 0;
                }

                sb.append(word);
                currentLength += word.length();
            }

            // Now we can split the string using the \n as a delimiter
            List<String> rows = Arrays.asList(sb.toString().split("\n"));
            for (String row : rows) {
                textList.add(new Text(row));
            }

        }

        return textList;

    }
}

结果:

 类似资料:
  • 问题内容: 我遇到了WordPress模板的轻微编码问题。这是我在模板中使用的代码: 在我的函数中,我使用它来剥离标签并仅从允许的标签中获取内容。 问题:我使用上面的代码从内容中剥离了标签,但是WordPress已经将图像标签放在段落中。因此结果是空段标记,其中图像被剥离。 只是为了清理我的代码和无用的空标签。我的问题是如何删除空的段落标签? 在此先多谢!:) 问题答案: 使用此正则表达式删除空的

  • 我试图将ActionListener添加到一个标签中,每当用户键入错误的密码或登录时,该标签就会弹出。这是我的登录控制器 我如何能够解决这个问题?我已经尝试了很多次(setOnAction, addMouseListener),但都不起作用:(。 如果你不介意的话,我还想问一下public void initialize函数。这是干什么用的?当我创建类时,它会自动弹出。 提前感谢

  • 我正在尝试使用for循环在JavaFX中迭代地向GridPane添加标签,但当我尝试启动应用程序时,我一直收到错误。控制台输出是: 我是这方面的初学者,但我明白它告诉我,我正在尝试放置一个已经放置的物体。 代码: 然后我继续使用一个标签数组,我相信它不会试图替换一个已经放置的对象,但是我收到了另一个错误: 代码:

  • 我有一个问题,我真的不知道如何在JavaFX中将多行添加到Label中。 例如: 因此,当循环结束时,标签仅显示最终值9。 因此,任何可以显示所有数字1-9并在它们之间加上断线(例如'\n')的解。 当我想显示包含许多菜肴的项目账单时,会出现这个问题。谢谢你的帮助。

  • 我是android新手,我对json有疑问:- 如果我有多行,如何在json中换行?像这样:< br>{ "联系人":< br>[ { "id": "c200 ",< br > "姓名":" Ravi Tamada ",< br > "电子邮件":" xxxx@gmail.com ",< br > "地址":" xx-xx-xxxx,x - street,x - country ",< br >

  • 这些指令(标识符)创建简短的段落,可用于内部信息的单位以及普通的文本: .. note:: toctree 指令(标识符)是描述在 TOC树 ,它生成子文件的内容表。对于本地内容表,可以用标准的reST contents directive。 词汇表 .. glossary:: 特别标记是用于显示 Special markup is available for displaying the pro