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

标签 java swing jtextpane defaultstyleddocument

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

我正在使用JTextPane

<小时/>

这是我的问题:我在文本内容中添加了一些样式(例如粗体、斜体、下划线或颜色)。然后,无论保存还是不保存该文档,我都可以通过单击“新文档”图标打开一个新文档。

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

我怎样才能实现这个目标?我在“新文档” Action 监听器中尝试了三种不同的方法 - 它们都不起作用。这些可以在下面看到:

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. 我们应该能够复制/粘贴/编译/测试。因此您需要包含导入语句

  2. 剪切/复制/粘贴操作和菜单项与问题无关,因此不应包含它们。

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

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

问题不在于文档。

每次移动文本 Pane 的插入符号时,文本 Pane 都会跟踪插入符号位置处的输入属性。因此,当您创建新文档时,如果脱字符号恰好位于具有 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 关键字。

关于java - 如何清除JTextPane中的所有样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52790001/

相关文章:

java - java中以字符开头并后跟数字的子字符串

java - 在文件上使用 renameTo 更改内容

java - 从瘦客户端(Web 浏览器)流向已安装并正在运行的应用程序

java - 调整框架大小时控制 Swing 中组件的大小

java - "AWT-EventQueue-0"java.lang.NullPointerException 异常

java - "java: No match."是什么意思?

java - 在 GUI 中动态创建多个面板

java - 更改 Java JInternalFrame 标题栏主题

java - 将大文本附加到 jtextpane 会导致“OutOfMemoryError : Java heap space”

java - JTextPane 撤消和重做整个单词