[英]How to set bold font style for selected text in JTextArea instance
我想為JTextArea實例中的選定文本設置粗體字體樣式。
我這樣嘗試:
textArea.getSelectedText().setFont(new Font("sansserif",Font.BOLD, 12));
但這行不通。 我也嘗試過用JTextPane
和JEditorPane
代替JTextArea
但是沒有效果。
我怎樣才能做到這一點?
我想為JTextArea實例中的選定文本設置粗體字體樣式。
您不能為JTextArea
做到這一點。 您需要使用JTextPane
。
然后,您可以使用StyledEditorKit
提供的默認Action
。 創建一個JButton
或JMenuItem
來執行此操作:
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。
這是代碼:
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.