#java #html #swing #forms #jeditorpane
#java #HTML #swing #формы #jeditorpane
Вопрос:
приложение генерирует некоторые HTML-страницы, которые должны отображаться в самом приложении.
Эти HTML-страницы содержат некоторые формы, которые будут использоваться пользователем для ввода некоторых значений.
До сих пор я использовал JTextPane, который отлично отображает HTML, но я не знаю, как взаимодействовать с формой для извлечения значений, введенных пользователем.
_
Возможно ли это сделать с помощью JTextPane / JEditorPane?
Если нет, есть ли у вас сейчас какой-либо другой способ взаимодействия с HTML-формой?
_
РЕДАКТИРОВАТЬ: следуя инструкциям Тульского, вот результат :
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 textamp;input2=More textamp;cb1=onamp;rb1=on
Обратите внимание, что атрибут «действие» является обязательным, в противном случае генерируется исключение.
_
Заранее спасибо за любую подсказку.
Комментарии:
1. не могли бы вы предоставить какой-нибудь код, с чем можно начать играть?
Ответ №1:
Я считаю, что если у вас есть кнопка отправки в вашей форме, она должна работать и отправлять данные на сервер. Я не уверен, что вы можете взаимодействовать с ней в коде. Эти элементы отображаются как swing component, поэтому теоретически вы получаете все компоненты из JTextPane и находите нужную кнопку и поля ввода.
РЕДАКТИРОВАТЬ Чтобы сделать это в JEditorPane, вам нужно установить для свойства auto for submition значение false
((HTMLEditorKit)textPane.getEditorKit()).setAutoFormSubmission(false);
затем вы сможете зарегистрировать средство прослушивания гиперссылок в панели редактора, и вы получите FormSubmitEvent
. У нее есть URL и метод, поэтому вы можете декодировать из нее некоторые данные.
Комментарии:
1. теоретически это должно быть что-то вроде этого, но после поиска в Google похожего варианта использования я не нашел кода, который делает это или что-то подобное. Игра с компонентом с возможностями Eclipse debug watch также не помогла. Возможно, есть другой способ получить данные, например, путем сбора данных POST при отправке формы.
2. посмотрите, чтобы увидеть, что перехватывать отправку не было абсурдной идеей. Следуя вашим замечательным советам, то есть отключив автоматическую отправку формы и зарегистрировавшись для события гиперссылки «FormSubmitEvent», я выполнил свою работу. Я отредактирую свой исходный пост с помощью некоторого кода. Большое спасибо!
3. @Серьезно: всегда пожалуйста. странно, что было довольно сложно найти какую-либо документацию по этому поводу. Еще одна вещь — убедитесь, что получаемое вами событие на самом деле является FormSubmitEvent, потому что, если вы добавите какие-либо другие гиперссылки к форме позже, у вас может возникнуть ClassCastException.