gpt4 book ai didi

java - 为什么 HTMLEditorKit 不想在 元素内插入 元素?

转载 作者:行者123 更新时间:2023-12-02 09:17:38 24 4
gpt4 key购买 nike

完整源代码可以在 here 找到.

如何在源中重现:

  1. 运行程序
  2. 点击粗体按钮
  3. 输入一些内容
  4. 转到粗体文本内的某个位置
  5. 点击斜体按钮
  6. 输入更多内容
  7. 请注意斜体文本不是粗体。

MCVE:

给你。大部分是由 Eclipse 生成的,所以很长。

public class MainFrame extends JFrame {

private JPanel contentPane;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}

public MainFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

JEditorPane editPane = new JEditorPane();
editPane.setEditable(false);
contentPane.add(editPane, BorderLayout.CENTER);

HTMLEditorKit HTMLKit = new HTMLEditorKit();

StyleSheet css = HTMLKit.getStyleSheet();
css.addRule("body {font-family: Helvetica;}");
HTMLKit.setDefaultCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));

editPane.setEditorKit(HTMLKit);
editPane.setOpaque(true);
editPane.setText("<b>I \"WHAT?\"</b>");

JButton btnInsertTheText = new JButton("Insert the text");
btnInsertTheText.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
HTMLKit.insertHTML((HTMLDocument) editPane.getDocument(), 3, "<i>SAID ", 0, 0, HTML.Tag.I);
}
catch (BadLocationException | IOException exc) {
// TODO Auto-generated catch block
exc.printStackTrace();
}

//System.out.println(editPane.getCaretPosition());
}
});
contentPane.add(btnInsertTheText, BorderLayout.NORTH);
}
}

运行示例,然后单击按钮。

所需的输出是:“什么?”

实际输出是:I SAID “什么?”

这是我正在构建的支持格式化的文本编辑器。

现在发生的情况是,如果我尝试插入 <i>标记为<b>标签,它插入 <i>标签。结果? <b>标签要么被移开,要么被分开!如何将一个插入另一个?

最佳答案

您还可以使用 JTextPane 来显示 HTML。

我发现它更容易,因为您可以使用文本属性来标记文本,并且无需担心 HTML 标记。

添加文本变成了两个语句过程:

  1. 您首先插入文本,以便它继承当前在插入位置有效的属性
  2. 然后将“斜体”属性应用于新添加的文本。

简单的例子:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;

public class TextPaneMRE extends JFrame
{
/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
TextPaneMRE frame = new TextPaneMRE();
frame.setVisible(true);
}
});
}

/**
* Create the frame.
*/
public TextPaneMRE()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);

JTextPane textPane = new JTextPane();
textPane.setContentType( "text/html" );
textPane.setText("<b>I WHAT?</b>");
textPane.setEditable(false);
add(textPane, BorderLayout.CENTER);

SimpleAttributeSet italic = new SimpleAttributeSet();
StyleConstants.setItalic(italic, true);

JButton btnInsertTheText = new JButton("Insert the text");
btnInsertTheText.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
try
{
StyledEditorKit editorKit = (StyledEditorKit)textPane.getEditorKit();
StyledDocument doc = (StyledDocument)textPane.getDocument();
String text = "SAID ";
doc.insertString(3, text, editorKit.getInputAttributes());
doc.setCharacterAttributes(3, text.length(), italic, false);
System.out.println("Text Pane: " + textPane.getText());
}
catch (BadLocationException exc)
{
// TODO Auto-generated catch block
exc.printStackTrace();
}
}
});

add(btnInsertTheText, BorderLayout.NORTH);
System.out.println("Text Pane: " + textPane.getText());
}
}

关于java - 为什么 HTMLEditorKit 不想在 <b> 元素内插入 <i> 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58886894/

24 4 0