簡體   English   中英

如何在JTextArea實例中為選定的文本設置粗體字體樣式

[英]How to set bold font style for selected text in JTextArea instance

我想為JTextArea實例中的選定文本設置粗體字體樣式。

我這樣嘗試:

textArea.getSelectedText().setFont(new Font("sansserif",Font.BOLD, 12));

但這行不通。 我也嘗試過用JTextPaneJEditorPane代替JTextArea但是沒有效果。

我怎樣才能做到這一點?

我想為JTextArea實例中的選定文本設置粗體字體樣式。

您不能為JTextArea做到這一點。 您需要使用JTextPane

然后,您可以使用StyledEditorKit提供的默認Action 創建一個JButtonJMenuItem來執行此操作:

JButton boldButton = new JButton( new StyledEditorKit.BoldAction() );
JMenuItem boldMenuItem = new JMenuItem( new StyledEditorKit.BoldAction() );

將按鈕或菜單項添加到框架。 然后,用戶可以在選擇按鈕/菜單項后單擊該按鈕以使其粗體。 這是大多數編輯器的工作方式。 您也可以為操作添加加速,只需使用鍵盤即可調用操作。

閱讀Swing教程中有關文本組件功能的部分,以獲取更多信息和工作示例。

介紹

@Freek de Bruijn和@Gilbert Le Blanc已經發布了有關如何做自己想做的(有用的)答案,但是它們都沒有解釋為什么您嘗試做的事情不起作用。 這不是答案

我怎樣才能做到這一點?

但是一個解釋

但這行不通。

編輯: @camickr發布了我認為是正確的方法。

回答

從關於JTextArea的教程中:

您可以通過多種方式自定義文本區域。 例如,盡管給定的文本區域只能以一種字體和顏色顯示文本 ,但是您可以設置其使用的字體和顏色。

(所有引號都是我的)和

如果希望文本區域使用多種字體或其他樣式顯示其文本,則應使用編輯器窗格或文本窗格。

這是因為JTextArea使用PlainDocument (見 ):

PlainDocument提供了一個基本的文本容器,其中所有文本都以相同的字體顯示

但是, JTextPane使用DefaultStyledDocument

一個沒有特定格式的樣式文本的容器。

您可以使用類似於更改顏色的JTextPane組件,如以下答案中所述: 如何為jTextArea中的選定文本設置字體顏色

例如:

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。

的JTextPane

這是代碼:

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();
            }
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM