Я создаю простое .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();
}
}
}