如何将 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();
【问题讨论】:
我意识到我的回答更适合您的最终目标,而不是您提出的问题,对此感到抱歉。 别抱歉,实际上,在我看到您的评论之前,我已经将我所有的JTextArea
s 切换为JTextPane
s,我现在正在学习使用属性和样式。感谢您在回答中为我提供JTextPane
s 的基本信息: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 是用于创建样式的实用程序类的示例(链接以给出定义样式的示例)。 addNewStyle
和changeFont
是两个最重要的参考方法。 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> 的行