如何清除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。
我们应该可以copy/paste/compile/test。所以你需要包含导入语句
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 关键字。
我正在使用 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。
我们应该可以copy/paste/compile/test。所以你需要包含导入语句
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 关键字。