2015-05-01 152 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

相关问题