6

如何轻松编辑 JTextPane 中选定文本的样式?这方面的资源似乎不多。即使你能指导我找到一个很好的资源,我也会非常感激。

另外,如何获取所选文本的当前样式?我试过styledDoc.getLogicalStyle(textPane.getSelectionStart());了,但似乎没有用。

4

5 回答 5

3

这是插入格式化的“Hello World!”的代码片段。a 中的字符串JEditorPane

Document doc = yourEditorPane.getDocument();

StyleContext sc = new StyleContext();
Style style = sc.addStyle("yourStyle", null);

Font font = new Font("Arial", Font.BOLD, 18);

StyleConstants.setForeground(style, Color.RED);
StyleConstants.setFontFamily(style, font.getFamily());
StyleConstants.setBold(style, true);

doc.insertString(doc.getLength(), "Hello World!", style);
于 2009-04-20T01:01:54.407 回答
2

看看这个 pastebin 中的以下代码:

http://pbin.oogly.co.uk/listings/viewlistingdetail/d6fe483a52c52aa951ca15762ed3d3

该示例来自此处:

http://www.java2s.com/Code/Java/Swing-JFC/JTextPaneStylesExample3.htm

看起来您可以在动作侦听器中使用以下内容更改样式:

final Style boldStyle = sc.addStyle("MainStyle", defaultStyle);
StyleConstants.setBold(boldStyle, true);   

doc.setCharacterAttributes(0, 10, boldStyle, true);

它将给定偏移量和长度之间的文本样式设置为特定样式。

有关更多详细信息,请参阅完整的 pastebin。不过,这应该可以解决您的问题。

于 2009-04-20T01:00:28.293 回答
2

操作文本面板的最简单方法是使用编辑器工具包及其相关操作。您可以在JDK示例(在jdk\demo\jfc\Stylepad下)中找到它的演示。

安装StyledEditorKit并使用FontSizeAction操作文本的示例代码:

  public static void main(String[] args) {
    // create a rich text pane
    JTextPane textPane = new JTextPane();
    JScrollPane scrollPane = new JScrollPane(textPane,
        JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    // install the editor kit
    StyledEditorKit editorKit = new StyledEditorKit();
    textPane.setEditorKit(editorKit);
    // build the menu
    JMenu fontMenu = new JMenu("Font Size");
    for (int i = 48; i >= 8; i -= 10) {
      JMenuItem menuItem = new JMenuItem("" + i);
      // add an action
      menuItem
          .addActionListener(new StyledEditorKit.FontSizeAction(
              "myaction-" + i, i));
      fontMenu.add(menuItem);
    }
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(fontMenu);
    // show in a frame
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600, 400);
    frame.setJMenuBar(menuBar);
    frame.setContentPane(scrollPane);
    frame.setVisible(true);
  }

(提示:如果您想使用FontFamilyAction,请查看GraphicsEnvironment.getAvailableFontFamilyNames()逻辑字体系列名称。)

于 2009-05-02T12:41:51.660 回答
0

我建议看一下 Sun 的关于编辑器窗格的Java 教程。

于 2009-04-20T00:48:02.927 回答
0

好的,哇。难以回答的问题。所以我还没有找到一种方法来获得给定角色的风格。但是,您可以获取给定字符的 MutableAttributeSet,然后测试样式是否在该属性集中。

   Style s; //your style
   Element run = styledDocument.getCharacterElement( 
       textPane.getSelectionStart() );
   MutableAttributeSet curAttr =
       ( MutableAttributeSet )run.getAttributes();
   boolean containsIt = curAttr.containsAttributes( s );

获取一系列字符的样式的一个问题是,可能有多个样式应用于该范围(例如:您可以选择一些为粗体而一些不是粗体的文本)。

要更新所选文本,您可以:

  Style s; //your style
  JTextPane textPane; //your textpane
  textPane.setCharacterAttributes( s, false );

哦,似乎函数 getLogicalStyle 不起作用,因为它返回包含 p 的段落的默认样式(或者可能只是样式),而不是 p 处字符的样式。

于 2009-05-01T04:52:54.323 回答