在 Swing 应用程序中显示 HTML 表单并与之交互

Posted

技术标签:

【中文标题】在 Swing 应用程序中显示 HTML 表单并与之交互【英文标题】:Display and interact with an HTML form in a Swing application 【发布时间】:2011-09-02 23:26:13 【问题描述】:

应用程序会生成一些 HTML 页面,这些页面应显示在应用程序本身中。

这些 HTML 页面包含一些 表单,用户可以使用这些表单输入一些值。

到目前为止,我使用了一个 JTextPane,它完美地呈现了 HTML,但我不知道如何与表单交互以检索用户输入的值.

_

是否可以使用 JTextPane / JEditorPane 做到这一点?

如果没有,您现在有没有其他方式与 HTML 表单交互?

_

编辑:按照 tulskiy 说明,结果如下:

package tests;

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

import org.junit.Test;


public class JTextPaneTests

    @Test
    public void testForms() throws Exception
    
        javax.swing.SwingUtilities.invokeLater(
            new Runnable()
            
                public void run()
                
                    javax.swing.JFrame jf = new javax.swing.JFrame();
                    jf.setSize(300,300);
                    jf.setVisible(true);
                    jf.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);

                    JTextPane textPane = new JTextPane();
                    textPane.setContentType("text/html");
                    textPane.setEditable(false);
                    textPane.setText(
                            "<html>" +
                                "<body>" +
                                    "<form action=\"#\">" +
                                        "<input name=\"input1\" type=\"text\" />" +
                                        "<input name=\"input2\" type=\"text\" /><br/>" +
                                        "<input name=\"cb1\" type=\"checkbox\" /><br/>" +
                                        "<input name=\"rb1\" type=\"radio\" /><br/>" +
                                        "<input type=\"submit\" value=\"go\" />" +
                                    "</form>" +
                                "</body>" +
                            "</html>");

                    jf.getContentPane().setLayout(new BoxLayout(jf.getContentPane(), BoxLayout.Y_AXIS));

                    jf.getContentPane().add(textPane);

                    HTMLEditorKit kit = (HTMLEditorKit)textPane.getEditorKit();
                    kit.setAutoFormSubmission(false);
                    textPane.addHyperlinkListener(new HyperlinkListener()
                                               
                        @Override
                        public void hyperlinkUpdate(HyperlinkEvent e)
                        
                            if (e instanceof FormSubmitEvent)
                            
                                System.out.println(((FormSubmitEvent)e).getData());
                            
                        
                    );
                
            
        );

        System.in.read();
    

根据用户输入,输出将类似于:

input1=Some+text&input2=More+text&cb1=on&rb1=on

注意“action”属性是必须的,否则会抛出异常。

_

提前感谢您的任何提示。

【问题讨论】:

你能提供一些代码,开始玩吗? 【参考方案1】:

我相信如果您的表单上有一个提交按钮,它应该可以工作并将数据发送到服务器。我不确定您是否可以在代码中与之交互。这些元素被渲染为摆动组件,因此理论上您可以从 JTextPane 中获取所有组件并找到您的按钮和输入字段。

编辑要在 JEditorPane 中执行此操作,您需要将提交属性的 auto 设置为 false

((HTMLEditorKit)textPane.getEditorKit()).setAutoFormSubmission(false);

然后您将能够在编辑器窗格中注册一个超链接侦听器,您将收到一个FormSubmitEvent。它有 url 和方法,所以你可以从中解码一些数据。

【讨论】:

理论上这应该是这样的,但在谷歌搜索类似的用例之后,我发现没有代码可以做到这一点或类似的东西。使用具有 Eclipse 调试监视功能的组件也无济于事。也许还有另一种获取数据的方法,例如通过在提交表单时捕获 POST 数据。 很高兴看到收到提交并不是一个荒谬的想法。按照您的伟大提示,即禁用自动表单提交并注册“FormSubmitEvent”超链接事件,完成了这项工作。我将用一些代码编辑我的原始帖子。非常感谢! @Serious:不客气。奇怪的是,很难找到任何关于此的文档。还有一件事 - 检查您收到的事件实际上是 FormSubmitEvent,因为如果您稍后将任何其他超链接添加到表单,您可能会遇到 ClassCastException。

以上是关于在 Swing 应用程序中显示 HTML 表单并与之交互的主要内容,如果未能解决你的问题,请参考以下文章

创建Web表单并与数据库集成吗?

帮写一个Java简单的Swing-表单登录

Swing 的 JavaFX 模态窗口所有权

在 Swing 应用程序中渲染 html

在 Swing 中显示 HTML

Java:Swing 中的 HTML/CSS,内联显示不起作用