Отображение HTML-формы в приложении Swing и взаимодействие с ней

приложение создает несколько HTML-страниц, которые должны отображаться в самом приложении.

Эти HTML-страницы содержат некоторые формы, которые будут использоваться пользователем для ввода некоторых значений.

До сих пор я использовал JTextPane, который отлично отображает HTML, но я не знаю, как взаимодействовать с формой для получения значений, введенных пользователем.

_

Можно ли это сделать с помощью JTextPane/JEditorPane?

Если нет, есть ли у вас другой способ взаимодействия с HTML-формой?

_

EDIT: следуя инструкциям 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 является обязательным, иначе будет выдано исключение.

_

Заранее спасибо за любую подсказку.


person Pragmateek    schedule 26.05.2011    source источник
comment
Можете ли вы предоставить какой-нибудь код, что-то, с чем можно начать играть?   -  person Boro    schedule 27.05.2011


Ответы (1)


Я считаю, что если у вас есть кнопка отправки в форме, она должна работать и отправлять данные на сервер. Я не уверен, что вы можете взаимодействовать с ним в коде. Эти элементы визуализируются как компонент Swing, поэтому теоретически вы получаете все компоненты из JTextPane и находите свою кнопку и поля ввода.

EDIT Чтобы сделать это в JEditorPane, вам нужно установить для свойства auto for submit значение false

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

затем вы сможете зарегистрировать прослушиватель гиперссылок с помощью панели редактора, и вы получите файл FormSubmitEvent. У него есть URL и метод, поэтому вы можете декодировать некоторые данные из него.

person Denis Tulskiy    schedule 27.05.2011
comment
теоретически это должно быть что-то вроде этого, но после поиска аналогичного варианта использования я не нашел кода, который делает это или что-то подобное. Игра с компонентом с возможностями отладки Eclipse также не помогла. Может быть, есть другой способ получить данные, например. путем перехвата данных POST при отправке формы. - person Pragmateek; 27.05.2011
comment
Рад видеть, что ловить сабмиш было не абсурдной идеей. Следуя вашим замечательным советам, то есть отключив автоматическую отправку формы и зарегистрировавшись на событие гиперссылки FormSubmitEvent, я сделал свое дело. Я отредактирую свой оригинальный пост с некоторым кодом. Большое спасибо ! - person Pragmateek; 28.05.2011
comment
@Серьезно: не за что. странно, что было трудно найти какую-либо документацию по этому поводу. Еще один момент — убедитесь, что полученное вами событие на самом деле является FormSubmitEvent, потому что, если вы добавите в форму какие-либо другие гиперссылки позже, вы можете получить ClassCastException. - person Denis Tulskiy; 28.05.2011