如何将 JTextArea 中的选定文本转换为字符串?

Posted

技术标签:

【中文标题】如何将 JTextArea 中的选定文本转换为字符串?【英文标题】:How to make selected text in JTextArea into a String? 【发布时间】:2013-03-29 08:46:22 【问题描述】:

我正在开发一个带有 java swing 和 layouts 的简单文字处理器,我试图弄清楚如何使单个文本块变为粗体、斜体或不同的字体大小,而不是整个文本块在一次在我的 JTextArea 中。

当用户用鼠标突出显示 JTextArea 中的文本时,是否有某种方法可以初始化字符串?如果有某种 ActionListener 或 JTextArea 可以检测所有这些并轻松将任何内容保存为字符串,我会喜欢它,但我不确定这是否可能。像这样的东西会很棒:

String selectedtext;
JTextArea type;

class TextPanel extends JPanel implements ActionListener

    public TextPanel()
    
        type = new JTextArea();
        type.addActionListener(this);
        this.add(type);
    

    public void actionPerformed(ActionEvent e)
    
        selectedtext = e.getSelected();
    

【问题讨论】:

我意识到我的回答更适合您的最终目标,而不是您提出的问题,对此感到抱歉。 别抱歉,实际上,在我看到您的评论之前,我已经将我所有的JTextAreas 切换为JTextPanes,我现在正在学习使用属性和样式。感谢您在回答中为我提供JTextPanes 的基本信息:D 【参考方案1】:

JTextArea 没有任何内置功能可以做到这一点,但是:

为了让某人选择文本,他们必须单击文本区域,拖动并释放单击。因此,附加一个 MouseListener 并实现 mouseReleased 方法来检查是否选择了任何文本,如果是,则将其保存为字符串:

public void mouseReleased(MouseEvent e) 
    if (textArea.getSelectedText() != null)  // See if they selected something 
        String s = textArea.getSelectedText();
        // Do work with String s
    

【讨论】:

非常感谢,这正是我所需要的!【参考方案2】:

JTextArea 没有这种能力。你应该看看 JEditorPane

它可以显示 html ,所以你可以使用粗体标签和你需要的任何东西..

【讨论】:

这不是一个很好的答案,但这并不意味着它无效。我怀疑 JEditorPane 是 OP 想要的。 @izuriel 这个答案是正确的,JTextPane/JEditorPane 内置支持 HighLighter for OPs 问how to make individual blocks of text bold, italics, or different font sizes instead of the whole block of text,请参阅 Oracle 教程 @izuriel - 问题的作者提到他正在构建一个小型文字处理器。我怀疑 OP 是否需要一个功能类似于 gedit 或记事本的文字处理器。 @Protostome JTextPane 对于文本编辑器来说是一个比JEditorPane 更好的选择,JEditorPane 是一个简单的 HTML 处理器。 @mKorbel,我很清楚你一定没有注意到我的回答。【参考方案3】:

您将无法使用JTextArea 完成此操作,您需要支持丰富的文本显示的东西,例如JTextPanel,您需要为其定义样式,将这些样式应用于特定地区。

Here 是用于创建样式的实用程序类的示例(链接以给出定义样式的示例)。 addNewStylechangeFont 是两个最重要的参考方法。 addNewStyle 方法展示了如何将预定义的样式添加到您可以在插入时引用的文档(如果您想以某种格式粘贴,主要用于粘贴)。 changeFont 方法展示了如何创建样式并将其应用到区域(在该方法中,区域是从 0 到文档末尾 - 即整个文档)。

您可能需要动态制作这些样式,因此您需要从该区域获取它们(如果存在)(我还没有这样做)。所有这些都是通过StyledDocument 完成的

将带有样式的文本附加到StyledDocument 的示例(纯粹是示例)是:

styledDocument.insertString(
                styledDocument.getLength(), textToInsert,
                styledDocument.getStyle(styleName));

自从我与JTextPane s 和StyledDocuments 合作以来已经有一段时间了,所以大部分内容都是从我工作的项目中提取的。我希望我能给你更多的信息,而不仅仅是一个起点。

【讨论】:

【参考方案4】:

您可以使用JTextComponent#setCaretPosition 后跟JTextComponent#moveCaretPosition 突出显示/选择

【讨论】:

【参考方案5】:

为了检测 JTextArea 中的选择变化,最好使用 CaretListener。

jTextArea.addCaretListener(new CaretListener()
   public void caretUpdate(CaretEvent ce)
   
        int dot=ce.getDot();
        int mark=ce.getMark();

              if(dot!=mark)
              selectedText=jTextArea.getSelectedText();
              else selectedText=null;
   
);

现在,如果你想在鼠标拖动时对选中的文本做一些操作,你可以这样做,因为 selectedText 已经更新了。

【讨论】:

以上是关于如何将 JTextArea 中的选定文本转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何从JTextArea中删除旧文本,以便文档大小不超过阈值? (JAVA)

JTextArea 到 ArrayList<String> 的行

如何计算文本在 JTextArea 中的行数(以及每行中的列数)?

JTextArea 中的文本更改事件?如何?

如何将随机森林中的选定特征转换为新列表

Java - 在 JTextArea 中将颜色设置为文本