gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:01:09 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com