Java 如何在JTextArea实例中为所选文本设置粗体字体样式

Java 如何在JTextArea实例中为所选文本设置粗体字体样式,java,swing,fonts,jtextarea,Java,Swing,Fonts,Jtextarea,我想为JTextArea实例中选定的文本设置粗体字体样式 我试着这样做: textArea.getSelectedText().setFont(new Font("sansserif",Font.BOLD, 12)); 但它不起作用。我还尝试了JTextPane和JEditorPane而不是JTextArea,但没有效果 如何才能做到这一点?您可以使用JTextPane组件,类似于以下答案中描述的更改颜色: 例如: import javax.swing.JFrame; import javax

我想为JTextArea实例中选定的文本设置粗体字体样式

我试着这样做:

textArea.getSelectedText().setFont(new Font("sansserif",Font.BOLD, 12));
但它不起作用。我还尝试了
JTextPane
JEditorPane
而不是
JTextArea
,但没有效果


如何才能做到这一点?

您可以使用
JTextPane
组件,类似于以下答案中描述的更改颜色:

例如:

import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;

public class BoldSelected {
    public static void main(final String[] args) {
        new BoldSelected().launchGui();
    }

    private void launchGui() {
        final String title = "Set bold font style for selected text in JTextArea instance";
        final JFrame frame = new JFrame("Stack Overflow: " + title);
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        final JTextPane textPane = new JTextPane();
        textPane.setText(title + ".");
        final Style style = textPane.addStyle("Bold", null);
        StyleConstants.setBold(style, true);
        textPane.getStyledDocument().setCharacterAttributes(4, 33, style, false);
        frame.getContentPane().add(textPane);
        frame.setVisible(true);
    }
}

您必须在JTextPane上设置插入符号侦听器,以便在选中部分或全部文本时进行侦听

这是我创建的GUI

下面是代码:

package com.ggl.testing;

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;

public class JTextPaneTest implements Runnable {

    private JTextPane textPane;

    private StyledDocument styledDocument;

    public static void main(String[] args) throws BadLocationException {
        SwingUtilities.invokeLater(new JTextPaneTest());
    }

    public JTextPaneTest() throws BadLocationException {
        this.styledDocument = new DefaultStyledDocument();
        this.styledDocument.insertString(0, displayText(), null);
        addStylesToDocument(styledDocument);
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("JTextPane Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        textPane = new JTextPane(styledDocument);
        textPane.addCaretListener(new SelectedText());
        textPane.setPreferredSize(new Dimension(250, 125));
        JScrollPane scrollPane = new JScrollPane(textPane);

        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    private String displayText() {
        return "This is some sample text.  Pick part of the text to select "
                + "by double clicking on a word.";
    }

    private void addStylesToDocument(StyledDocument styledDocument) {
        Style def = StyleContext.getDefaultStyleContext().getStyle(
                StyleContext.DEFAULT_STYLE);
        Style s = styledDocument.addStyle("bold", def);
        StyleConstants.setBold(s, true);
    }

    private class SelectedText implements CaretListener {

        @Override
        public void caretUpdate(CaretEvent event) {
            int dot = event.getDot();
            int mark = event.getMark();
            if (dot != mark) {
                if (dot < mark) {
                    int temp = dot;
                    dot = mark;
                    mark = temp;
                }
                boldSelectedText(mark, dot);
            }
        }

        private void boldSelectedText(int mark, int dot) {
            try {
                int length = dot - mark;
                String s = styledDocument.getText(mark, length);
                styledDocument.remove(mark, length);
                styledDocument.insertString(mark, s,
                        styledDocument.getStyle("bold"));
            } catch (BadLocationException e) {
                e.printStackTrace();
            }
        }

    }

}
package com.ggl.testing;
导入java.awt.Dimension;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
导入javax.swing.SwingUtilities;
导入javax.swing.event.CaretEvent;
导入javax.swing.event.CaretListener;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DefaultStyledDocument;
导入javax.swing.text.Style;
导入javax.swing.text.StyleConstants;
导入javax.swing.text.StyleContext;
导入javax.swing.text.StyledDocument;
公共类JTextPaneTest实现可运行{
私有JTextPane textPane;
私有样式文档样式文档;
公共静态void main(字符串[]args)引发BadLocationException{
invokeLater(新的JTextPaneTest());
}
public JTextPaneTest()引发BadLocationException{
this.styledDocument=新的DefaultStyledDocument();
this.styledDocument.insertString(0,displayText(),null);
addStylesToDocument(styledDocument);
}
@凌驾
公开募捐{
JFrame=新JFrame(“JTextPane测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(真);
textPane=新的JTextPane(styledDocument);
textPane.addCaretListener(新建SelectedText());
textPane.setPreferredSize(新维度(250125));
JScrollPane scrollPane=新的JScrollPane(textPane);
frame.add(滚动窗格);
frame.pack();
frame.setVisible(true);
}
私有字符串displayText(){
return“这是一些示例文本。选择要选择的部分文本”
+“双击一个单词。”;
}
私有void addStylesToDocument(StyledDocument StyledDocument){
Style def=StyleContext.getDefaultStyleContext().getStyle(
StyleContext.DEFAULT_样式);
Styles=styledDocument.addStyle(“粗体”,def);
StyleConstants.setBold(s,true);
}
私有类SelectedText实现CaretListener{
@凌驾
公共无效caretUpdate(CaretEvent事件){
int dot=event.getDot();
int mark=event.getMark();
如果(点!=标记){
如果(点<标记){
int temp=点;
点=标记;
标记=温度;
}
粗体选定文本(标记、点);
}
}
私有void boldSelectedText(整数标记,整数点){
试一试{
整数长度=点标记;
字符串s=styledDocument.getText(标记,长度);
样式文件。删除(标记、长度);
styledDocument.insertString(标记,s,
getStyle(“粗体”);
}捕获(错误位置异常e){
e、 printStackTrace();
}
}
}
}
我想为JTextArea实例中选定的文本设置粗体字体样式

您不能为
JTextArea
执行此操作。您需要使用
JTextPane

然后,您可以使用
StyledEditorKit
提供的默认
操作。创建一个
JButton
JMenuItem
来执行此操作:

JButton boldButton = new JButton( new StyledEditorKit.BoldAction() );
JMenuItem boldMenuItem = new JMenuItem( new StyledEditorKit.BoldAction() );
将按钮或菜单项添加到框架中。选择文本后,用户可以单击按钮/菜单项以加粗文本。这是大多数编辑的工作方式。您还可以将加速度添加到动作中,只需使用键盘即可调用该动作


阅读上Swing教程中的部分,了解更多信息和工作示例。

简介

关于如何做你想做的(有用的)答案已经被@ Frutk de Brujn和@ Gilbert Le Blanc发布,但是没有一个解释你为什么要做的事情不起作用。这不是我的答案

我该怎么做

但这是一种解释

但它不起作用

编辑:@camickr发布了我认为正确的方法

回答

在教程中,关于:

您可以通过多种方式自定义文本区域。例如,尽管给定的文本区域只能以一种字体和颜色显示文本,但您可以设置它使用的字体和颜色

(引用的所有重点都是我的)和

如果希望文本区域使用多种字体或其他样式显示其文本,则应使用编辑器窗格或文本窗格

这是因为
JTextArea
使用
PlainDocument
(请参阅):

PlainDocument
为文本提供了一个基本容器,所有文本都以相同的字体显示

但是,
JTextPane
使用
DefaultStyledDocument

没有特定格式的样式文本的容器


检查此链接:我想加粗所选文本及其对所有文本的影响
textArea.getSelectedText()
方法返回字符串,因此我无法调用
textArea.getSelectedText().setFont[…])
“您必须在JTextArea上设置插入符号侦听器”,但您是为
JTextPane
@user1803551执行此操作的:您是正确的。JTextArea没有支持它的样式化文档。我忘了更改JFrame标题。我已经修好了