2015-05-01 183 views
1

我想爲JTextArea實例中所選文本設置粗體字體樣式。如何在JTextArea實例中爲所選文本設置粗體字體樣式

我試着這樣說:

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

但它不工作。我也試過JTextPaneJEditorPane而不是JTextArea,但沒有效果。

我該怎麼做?

+1

檢查此鏈接:http://stackoverflow.com/questions/9141449/styling-text-in-a-jtextarea-or-jtextpane –

+0

我要加粗選定的文本及其上的所有文本 – Ehsan

+0

的影響的'textArea.getSelectedText()'方法返回一個字符串,所以我無法調用'textArea.getSelectedText()。setFont [...])''。 –

回答

0

你必須建立一個插入符偵聽上的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(); 
      } 
     } 

    } 

} 
+0

「*您必須在JTextArea *上設置插入符偵聽器」,但是您需要爲「JTextPane」執行此操作。 – user1803551

+0

@ user1803551:你是對的。 JTextArea沒有支持它的樣式化文檔。我忘了更改JFrame標題。我已經解決了答案。 –

0

您可以使用類似於更改顏色的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); 
    } 
} 
1

我想設置爲JTextArea的情況下選定的文本加粗字體樣式。

對於JTextArea,您不能這樣做。您需要使用JTextPane

然後您可以使用StyledEditorKit提供的默認Action。創建JButtonJMenuItem做到這一點:

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

添加按鈕或菜單項的框架。然後,用戶可以點擊按鈕/菜單項,以便在文字被選中後加粗文字。這是大多數編輯工作的方式。您也可以添加一個加速到動作的操作,只需使用鍵盤即可調用。

閱讀有關Text Component Features的Swing教程的部分以獲取更多信息和工作示例。

1

介紹

的(有用的)答案怎麼做你想做的事已經發表@Freek德布魯因和@Gilbert勒布朗是什麼,但他們沒有解釋爲什麼你在做什麼試圖做不起作用。這不是一個答案

我該怎麼做?

的解釋,但它不工作。

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

回答

從教程的約JTextArea

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

(引號中所有的重點是我的)和

如果你想要的文字區域中使用多種字體或其他樣式來顯示其文本,你應該使用編輯器窗格或文本窗格。

這是因爲JTextArea使用PlainDocument(見this):

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

然而,JTextPane使用DefaultStyledDocument

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

+0

'如何做你想做的(有用的)答案已經被張貼......'我會不同意這一點。那些答案重新發明了輪子。 'StyledEditorKit'已經提供了這個功能。所有你需要做的就是使用BoldAction。 – camickr

+0

@camickr我沒有說他們是正確的答案。他們只是展示了一種做OP的方式,在這個意義上他們是有用的。我試着仔細選擇我的話:) – user1803551

+0

@camickr編輯我的回答,併爲其+1了。 – user1803551

相關問題