gpt4 book ai didi

java - java swing将表格插入html文档

转载 作者:行者123 更新时间:2023-12-01 11:18:34 25 4
gpt4 key购买 nike

我有一个带有两个 JTextPanes 的简单 swing 应用程序。在第一个中,我编写了一个 html 代码,在第二个中,我得到了该 html 定义的外观。我想要一个按钮,允许我将表格插入到文档中。这是我的代码:

public class TestEditor extends JFrame {
public TestEditor(){
createConnection();
createGUI();
}
private void createGUI(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
JScrollPane scroll1=new JScrollPane(text);
JScrollPane scroll2=new JScrollPane(html);
JSplitPane split=new JSplitPane();
split.setLeftComponent(scroll1);
split.setRightComponent(scroll2);
split.setDividerLocation(0.5);
split.setResizeWeight(0.5);
getContentPane().add(split);
table=new JButton("Insert table");
table.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StringBuilder builder=new StringBuilder("<table border=1>\n");
for(int i=0;i<4;i++){
builder.append("<tr>");
for(int j=0;j<4;j++){
builder.append("<td></td>");
}
builder.append("</tr>\n");
}
builder.append("</table>\n");
try{
text.getStyledDocument().insertString(text.getCaretPosition(), builder.toString(), null);
}catch(BadLocationException ex){
ex.printStackTrace();
}
}
});
getContentPane().add(table, BorderLayout.SOUTH);
setTitle("Test");
setPreferredSize(new Dimension(600,300));
pack();
}
private void createConnection(){
text=new JTextPane();
html=new JTextPane();
html.setContentType("text/html");
html.getStyledDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
private void update(){
if(fromText) return;
fromHtml=true;
text.setText(html.getText());
fromHtml=false;
}
});
text.getStyledDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
private void update(){
if(fromHtml) return;
fromText=true;
html.setText(text.getText());
fromText=false;
}
});
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TestEditor().setVisible(true);
}
});
}
private JTextPane text;
private JTextPane html;
private boolean fromHtml, fromText;
private JButton table;

}

但是,这会在错误的位置插入表格,最常见的是在结束标记之后。我的目标是将表格插入到右侧编辑器中插入符号所在的位置。我应该怎么办?如何检测正确的位置?

最佳答案

我测试了您的代码,当您编辑样式文档时它会失败,但当您编辑文本文档时它会起作用。原因很简单:当调用 update() 时,使用 setText() 会将插入符号放在文档末尾。然后html代码自然会插入到最后。

因此,理想情况下,您希望跟踪插入符位置并在 setText() 之后巧妙地更新它。但这并不容易:如何管理插入或删除的文本?

所以这里有一个建议:当点击“添加表格”按钮时,检测哪个编辑器具有焦点(=插入符位置相关),并在相应的编辑器中插入html代码。

但是,在样式文档中插入 html 代码的方式会略有不同(以避免被转义):

HTMLEditorKit kit = (HTMLEditorKit) html.getEditorKit();
HTMLDocument doc = (HTMLDocument) html.getStyledDocument();
kit.insertHTML(doc, html.getCaretPosition(), builder.toString(), 0, 0, null);

所以你应该得到类似的东西:

Component c = getFocusOwner();
if(c==html){
HTMLEditorKit kit = (HTMLEditorKit) html.getEditorKit();
HTMLDocument doc = (HTMLDocument) html.getStyledDocument();
kit.insertHTML(doc, html.getCaretPosition(), builder.toString(), 0, 0, null);
}else if(c==text){
text.getStyledDocument().insertString(text.getCaretPosition(), builder.toString(), null);
}

此外,使按钮无法聚焦以避免 getFocusOwner() 检测到按钮点击:

table.setFocusable(false);

关于java - java swing将表格插入html文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31515735/

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