如何清除JTextPane中的所有样式?

How to clear all the styles in JTextPane?

我正在使用 RTFEditorKit() 创建一个简单的 .rtf 文件编辑器应用程序。我添加了创建新文档、打开 .rtf 文档、另存为 .rtf 文档以及为文档内容添加粗体、斜体和下划线等样式的代码。

我正在使用 JTextPane


这是我的问题:我为文本的内容添加了一些样式(例如粗体、斜体、下划线或颜色)。然后,保存或不保存该文档,我通过单击 "New Document" 图标打开一个新文档。

如果我在新文档中输入一些文本,文本显示为我在上一个文档中使用的粗体、斜体、下划线和颜色样式;而我本以为这些已经被清除了。

我怎样才能做到这一点?我已经在 "New Document" 动作侦听器中尝试了三种不同的方法 - none 有效。这些可以在下面看到:

StyledDocument styledDocument = new DefaultStyledDocument();
textPane.setStyledDocument(styledDocument = new DefaultStyledDocument());

Style bold = textPane.addStyle("bold", null);
textPane.getStyledDocument().setCharacterAttributes(0, textPane.getStyledDocument().getLength(), bold, false);

textPane.setFont(new Font("Arial", Font.PLAIN, 15));
textPane.setText("");

我的应用程序最少代码:

public class MyNotepadMini implements ActionListener {
public static JFrame frame;
public static JPanel panel;
public static JTextPane textPane;
public static RTFEditorKit rtf;
public static StyleContext styleContext;
public static DefaultStyledDocument defaultStyleDoc;
public static JScrollPane scrollPane;
public static JMenuBar menuBar;
public static JMenu fileMenu;
public static JMenu editMenu;
public static JMenu formatMenu;
public static JMenuItem newSubMenu;
public static JMenuItem openSubMenu;
public static JMenuItem save;
public static JMenuItem saveAs;
public static JMenuItem cut;
public static JMenuItem copy;
public static JMenuItem paste;
public static JMenuItem selectAll;
public static JMenuItem bold;
public static JMenuItem italic;
public static JMenuItem underline;
public static JMenuItem exit;
public static JFileChooser fc;
public static boolean openFileExtFlag = true;
public static boolean saveFileExtFlag = true;
public static File openFile;
public static File saveFile;
public static boolean saveWindowTitle = false;
public static boolean openFileFlag;
public static boolean saveFileFlag;
public static boolean saved = true;
public static boolean dontSaveOption;
public static BufferedReader br;
public static boolean saveForNewOpenExitListener;
public static boolean saveAsFlag;
public static int returnVal;
public static String filePath;
public static boolean flagForOpenListener;
public static StyledDocument styledDocument;
public static Style defaultStyle;

public MyNotepadMini() {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception e) {
        e.printStackTrace();
    }
    frame = new JFrame("My Notepad");
    panel = new JPanel(new BorderLayout());      

    styledDocument = new DefaultStyledDocument();
    rtf = new RTFEditorKit();
    textPane = new JTextPane(styledDocument);
    textPane.setEditorKit(rtf);
    styleContext = new StyleContext();

    scrollPane = new JScrollPane();
    scrollPane.getViewport().add(textPane);
    menuBar = new JMenuBar();
    fileMenu = new JMenu("File");
    fileMenu.setMnemonic(KeyEvent.VK_F);
    newSubMenu = new JMenuItem("New");
    newSubMenu.setAccelerator(KeyStroke.getKeyStroke('N', CTRL_DOWN_MASK));
    openSubMenu = new JMenuItem("Open...");
    openSubMenu.setAccelerator(KeyStroke.getKeyStroke('O', CTRL_DOWN_MASK));
    save = new JMenuItem("Save");
    save.setAccelerator(KeyStroke.getKeyStroke('S', CTRL_DOWN_MASK));
    editMenu = new JMenu("Edit");
    editMenu.setMnemonic(KeyEvent.VK_E);
    cut = new JMenuItem("Cut");
    cut.setAccelerator(KeyStroke.getKeyStroke('X', CTRL_DOWN_MASK));
    copy = new JMenuItem("Copy");
    copy.setAccelerator(KeyStroke.getKeyStroke('C', CTRL_DOWN_MASK));
    paste = new JMenuItem("Paste");
    paste.setAccelerator(KeyStroke.getKeyStroke('V', CTRL_DOWN_MASK));
    selectAll = new JMenuItem("Select All");
    selectAll.setAccelerator(KeyStroke.getKeyStroke('A', CTRL_DOWN_MASK));
    exit = new JMenuItem("Exit");
    exit.setMnemonic(KeyEvent.VK_X);
    formatMenu = new JMenu("Format");
    formatMenu.setMnemonic(KeyEvent.VK_F);
    bold = new JMenuItem(new StyledEditorKit.BoldAction());
    bold.setText("Bold");
    bold.setMnemonic(KeyEvent.VK_B);
    bold.setAccelerator(KeyStroke.getKeyStroke('B', CTRL_DOWN_MASK));
    italic = new JMenuItem(new StyledEditorKit.ItalicAction());
    italic.setText("Italic");
    italic.setMnemonic(KeyEvent.VK_I);
    italic.setAccelerator(KeyStroke.getKeyStroke('I', CTRL_DOWN_MASK));
    underline = new JMenuItem(new StyledEditorKit.UnderlineAction());
    underline.setText("Underline");
    underline.setMnemonic(KeyEvent.VK_U);
    underline.setAccelerator(KeyStroke.getKeyStroke('U', CTRL_DOWN_MASK));

    defaultStyle = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);

    cut.addActionListener(this);
    copy.addActionListener(this);
    paste.addActionListener(this);
    selectAll.addActionListener(this);
    exit.addActionListener(this);
    newSubMenu.addActionListener(this);

    editMenu.addMenuListener(new MenuListener() {
        public void menuSelected(MenuEvent event) {
            if (textPane.getSelectionStart() == textPane.getSelectionEnd()) {
                cut.setEnabled(false);
                copy.setEnabled(false);
            } else {
                cut.setEnabled(true);
                copy.setEnabled(true);
            }
        }

        public void menuDeselected(MenuEvent event) {
        }

        public void menuCanceled(MenuEvent event) {  
        }
    });

    scrollPane.setPreferredSize(new Dimension(700,500));
    fileMenu.add(newSubMenu);
    fileMenu.add(openSubMenu);
    fileMenu.add(save);
    fileMenu.add(exit);
    editMenu.add(cut);
    editMenu.add(copy);
    editMenu.add(paste);
    editMenu.addSeparator();
    editMenu.add(selectAll);
    formatMenu.add(bold);
    formatMenu.add(italic);
    formatMenu.add(underline);
    menuBar.add(fileMenu);
    menuBar.add(editMenu);
    menuBar.add(formatMenu);

    textPane.setFont(new Font("Arial", Font.PLAIN, 12));    
    panel.add(scrollPane, BorderLayout.CENTER);
    panel.add(new JLabel(" "), BorderLayout.EAST);
    panel.add(new JLabel(" "), BorderLayout.WEST);
    panel.add(new JLabel(" "), BorderLayout.SOUTH);

    frame.setJMenuBar(menuBar);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.pack();
    textPane.requestFocus();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

public static void main(String[] args) {
    new MyNotepadMini();
}

public void actionPerformed(ActionEvent ae) {
    if ((ae.getSource() == cut)) {
        textPane.cut();
        textPane.requestFocus();
    } else if ((ae.getSource() == copy)) {
        textPane.copy();
        textPane.requestFocus();
    } else if ((ae.getSource() == paste)) {
        textPane.paste();
        textPane.requestFocus();
    } else if (ae.getSource() == selectAll) {
        textPane.selectAll();
    } else if ((ae.getSource() == exit)){   
        System.exit(0);
    } else if ((ae.getSource() == newSubMenu)) {                        /** New document **/
            textPane.setText("");
            textPane.setStyledDocument(styledDocument = new DefaultStyledDocument());

            Style bold = textPane.addStyle("bold", null);
            textPane.getStyledDocument().setCharacterAttributes(0, textPane.getStyledDocument().getLength(), bold, false);

            /*sampleDocument.setCharacterAttributes(0, sampleDocument.getLength(), defaultStyle, true);
              defaultStyleDoc = new DefaultStyledDocument(styleContext);
              textPane.setDocument(defaultStyleDoc);*/

            /*textPane.setFont(new Font("Arial", Font.PLAIN, 15));
            textPane.setText("");*/

            textPane.requestFocus();
        } 
}

}

I have given the minimal code here.

这不是最小代码或适当的 MCVE。

  1. 我们应该可以copy/paste/compile/test。所以你需要包含导入语句

  2. cut/copy/paste 操作和菜单项与问题无关,因此不应包括在内。

我们只有一定的时间来回答问题,所以我们只想查看与问题直接相关的最少代码。

How to get rid of these styles in the New document - the text should be plain.

不是文档的问题。

每次移动文本窗格的插入符号时,文本窗格都会跟踪插入符号位置的输入属性。因此,当您创建新文档时,如果插入符恰好位于具有 3 个属性的字符上,则这些属性将在您下次开始键入时保留。

您可以使用以下方法清除这些属性:

MutableAttributeSet mas = textPane.getInputAttributes();
System.out.println("before: " + mas);
mas.removeAttributes(mas);
System.out.println("after: " + mas);

当您创建新文档时。

此外,

public static JFrame frame;
public static JPanel panel;
public static JTextPane textPane;

您不应在任何变量中使用 static 关键字。