我想爲JTextArea實例中所選文本設置粗體字體樣式。如何在JTextArea實例中爲所選文本設置粗體字體樣式
我試着這樣說:
textArea.getSelectedText().setFont(new Font("sansserif",Font.BOLD, 12));
但它不工作。我也試過JTextPane
和JEditorPane
而不是JTextArea
,但沒有效果。
我該怎麼做?
我想爲JTextArea實例中所選文本設置粗體字體樣式。如何在JTextArea實例中爲所選文本設置粗體字體樣式
我試着這樣說:
textArea.getSelectedText().setFont(new Font("sansserif",Font.BOLD, 12));
但它不工作。我也試過JTextPane
和JEditorPane
而不是JTextArea
,但沒有效果。
我該怎麼做?
你必須建立一個插入符偵聽上的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();
}
}
}
}
「*您必須在JTextArea *上設置插入符偵聽器」,但是您需要爲「JTextPane」執行此操作。 – user1803551
@ user1803551:你是對的。 JTextArea沒有支持它的樣式化文檔。我忘了更改JFrame標題。我已經解決了答案。 –
您可以使用類似於更改顏色的JTextPane
組件,如以下答案中所述:How to set font color for selected text in 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);
}
}
我想設置爲JTextArea的情況下選定的文本加粗字體樣式。
對於JTextArea
,您不能這樣做。您需要使用JTextPane
。
然後您可以使用StyledEditorKit
提供的默認Action
。創建JButton
或JMenuItem
做到這一點:
JButton boldButton = new JButton(new StyledEditorKit.BoldAction());
JMenuItem boldMenuItem = new JMenuItem(new StyledEditorKit.BoldAction());
添加按鈕或菜單項的框架。然後,用戶可以點擊按鈕/菜單項,以便在文字被選中後加粗文字。這是大多數編輯工作的方式。您也可以添加一個加速到動作的操作,只需使用鍵盤即可調用。
閱讀有關Text Component Features的Swing教程的部分以獲取更多信息和工作示例。
介紹
的(有用的)答案怎麼做你想做的事已經發表@Freek德布魯因和@Gilbert勒布朗是什麼,但他們沒有解釋爲什麼你在做什麼試圖做不起作用。這不是一個答案
我該怎麼做?
但
的解釋,但它不工作。
編輯: @camickr發佈了我認爲是正確的方法。
回答
從教程的約JTextArea
:
您可以通過多種方式自定義文本區域。例如,雖然給定的文本區域只能以一種字體和顏色顯示文本,但您可以設置它使用的字體和顏色。
(引號中所有的重點是我的)和
如果你想要的文字區域中使用多種字體或其他樣式來顯示其文本,你應該使用編輯器窗格或文本窗格。
這是因爲JTextArea
使用PlainDocument
(見this):
PlainDocument
提供了一個基本的容器,其中所有文本被顯示在相同的字體文本。
然而,JTextPane
使用DefaultStyledDocument
:
在沒有特定格式樣式的文本的容器。
'如何做你想做的(有用的)答案已經被張貼......'我會不同意這一點。那些答案重新發明了輪子。 'StyledEditorKit'已經提供了這個功能。所有你需要做的就是使用BoldAction。 – camickr
@camickr我沒有說他們是正確的答案。他們只是展示了一種做OP的方式,在這個意義上他們是有用的。我試着仔細選擇我的話:) – user1803551
@camickr編輯我的回答,併爲其+1了。 – user1803551
檢查此鏈接:http://stackoverflow.com/questions/9141449/styling-text-in-a-jtextarea-or-jtextpane –
我要加粗選定的文本及其上的所有文本 – Ehsan
的影響的'textArea.getSelectedText()'方法返回一個字符串,所以我無法調用'textArea.getSelectedText()。setFont [...])''。 –