【问题标题】:Resetting attributes in a Document after inserting a String插入字符串后重置文档中的属性
【发布时间】:2011-08-22 18:09:20
【问题描述】:

我有一个 JTextComponent,用户可以在其中通过两种方式输入文本:

  • 他可以直接在里面输入文字。
  • 使用第二个控件,他可以间接地将文本插入其中。这是通过以编程方式调用 insertString() 来完成的。

第二种方式插入的文本中使用的字体将与直接输入的字体不同。输入文本的字体将是 JTextComponent 的默认字体。

这里是代码。 TODO 是我不知道该怎么做的。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class ResetAttributesInDocument extends JApplet {

    private ButtonListener bl = new ButtonListener();
    private JTextPane myJTextComponent;

    public void init() {
        JPanel contentPanel = new JPanel(new BorderLayout());
        myJTextComponent = new JTextPane();
        contentPanel.add(myJTextComponent, BorderLayout.CENTER);
        JButton insertTextButton = new JButton("Insert text");
        insertTextButton.addActionListener(bl);
        contentPanel.add(insertTextButton, BorderLayout.SOUTH);
        getContentPane().add(contentPanel);
    }

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            final Document doc = myJTextComponent.getDocument();
            final int caretPosition = myJTextComponent.getCaretPosition();

            SimpleAttributeSet set = new SimpleAttributeSet();
            StyleConstants.setFontFamily(set, "Courier New");
            // Possibly add more attributes to set here.

            try {
                doc.insertString(caretPosition, "text in Courier New", set);
            } catch (BadLocationException e1) {
                e1.printStackTrace();
            }

            // TODO Reset the attributes back to what they originally were so
            // that any new text the user enters after the inserted text is in
            // the original font.
        }
    }
}

有没有办法将属性重置回原来的样子?

【问题讨论】:

    标签: java swing document


    【解决方案1】:

    你的问题没有意义。

    首先,您声明“如果用户键入...”,这意味着用户做了某事。

    然后你说你想“做这样的事情......”,这意味着你正在代码中做一些不受用户控制的事情,因为你手动调用了 insertString() 方法。

    发布您的 SSCCE 来证明问题并描述复制问题的确切步骤。

    有没有办法将属性重置回原来的样子?

    每次插入符号更改位置时都会重置属性,因此您需要使用 CaretListener 处理此问题。比如:

    // <applet code="ResetAttributesInDocument.class" width="400" height="400"></applet>
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    
    public class ResetAttributesInDocument extends JApplet implements CaretListener
    {
        private ButtonListener bl = new ButtonListener();
        private JTextPane myJTextComponent;
        private SimpleAttributeSet set;
    
        public void init() {
            JPanel contentPanel = new JPanel(new BorderLayout());
            myJTextComponent = new JTextPane();
            myJTextComponent.addCaretListener( this );
            contentPanel.add(myJTextComponent, BorderLayout.CENTER);
            JButton insertTextButton = new JButton("Insert text");
            insertTextButton.addActionListener(bl);
            contentPanel.add(insertTextButton, BorderLayout.SOUTH);
            getContentPane().add(contentPanel);
    
            set = new SimpleAttributeSet();
            StyleConstants.setFontFamily(set, "Courier New");
            StyleConstants.setForeground(set, Color.GREEN);
        }
    
        public void caretUpdate(CaretEvent e)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    String styleFamily = StyleConstants.getFontFamily( set );
    
                    AttributeSet attributes = myJTextComponent.getCharacterAttributes();
                    String attributeFamily = attributes.getAttribute(StyleConstants.FontFamily).toString();
    
                    if (! styleFamily.equals(attributeFamily))
                    {
                        StyledEditorKit k = (StyledEditorKit)myJTextComponent.getEditorKit();
                        k.getInputAttributes().removeAttributes(set);
                    }
                }
            });
        }
    
        class ButtonListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                final Document doc = myJTextComponent.getDocument();
                final int caretPosition = myJTextComponent.getCaretPosition();
    
                try
                {
                    doc.insertString(caretPosition, "text in Courier New", set);
                }
                catch (BadLocationException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 2013-07-04
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多