Как очистить все стили в JTextPane? - PullRequest
0 голосов
/ 13 октября 2018

Я создаю простое .rtf приложение для редактирования файлов, используя RTFEditorKit().Я добавил код для создания нового документа, открытия документа .rtf, сохранения в виде документа .rtf и добавления стилей к содержимому документа, таких как полужирный шрифт, курсив и подчеркивание.

IЯ использую JTextPane.


. Вот моя проблема: я добавил некоторые стили к содержимому (например, жирный, курсив, подчеркивание или цвет) к тексту.Затем, сохраняя или не сохраняя этот документ, я открываю новый документ, щелкая значок «Новый документ».

Если я введу какой-либо текст в Новый документ, текст будет отображаться с полужирным шрифтом, курсивом, подчеркиванием и цветными стилями, которые я использовал в предыдущем документе;тогда как я ожидал, что они будут очищены.

Как мне этого добиться?Я попробовал три разных способа в слушателе действия «Новый документ» - ни один из них не работает.Это можно увидеть ниже:

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();
        } 
}

}

1 Ответ

0 голосов
/ 13 октября 2018

Я дал здесь минимальный код.

Это не минимальный код или правильный MCVE ".

  1. Мы должны бытьвозможность копировать / вставлять / компилировать / тестировать. Поэтому вам необходимо включить операторы импорта

  2. Действия и пункты меню вырезать / копировать / вставить не относятся к проблеме, поэтому они не должныбыть включенным.

У нас есть только определенное время, чтобы ответить на вопросы, поэтому мы хотим посмотреть только на минимальный код, который непосредственно связан с проблемой.

Как избавиться от этих стилей в Новом документе - текст должен быть простым.

Проблема не в Документе.

Каждый раз, когда вставляется текстовая панельПри перемещении текстовая панель отслеживает входные атрибуты в позиции каретки. Поэтому, когда вы создаете новый документ, если каретка расположена на символе с 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 a anyваших переменных.

...