#java #html #swing #jtextpane
#java #HTML #swing #jtextpane
Вопрос:
Я использую не редактируемый JTextPane для отображения некоторых данных в формате HTML. Я установил ContentType в «text / html», и это работает. Теперь я хотел добавить флажки HTML в JTextPane, прослушать их изменение и иметь возможность извлекать, если установлен определенный флажок. Возможно ли это?
Текст JTextPane находится в этом формате:
<html><form>
<input type="checkbox" name="checkbox1" value="value" /> checkbox1<br />
</form></html>
Должен ли я вообще использовать JTextPane для этой цели или есть лучший контроль? Обычные флажки — это не вариант, потому что мне нужен формат HTML для его упрощения.
Ответ №1:
Обычно вы бы использовали JEditorPane для отображения HTML.
В зависимости от вашего требования есть два способа сделать это:
- Компоненты Swing фактически добавляются на панель редактора. Итак, как только документ будет проанализирован и панель редактора будет повторно проверена (), вы сможете просто получить список всех компонентов, добавленных в панель редактора. Вы можете проверить имя класса, чтобы найти нужные компоненты.
- HTMLDocument содержит атрибуты каждого добавленного компонента, включая модель компонентов. Таким образом, вы можете выполнить поиск в документе, чтобы получить модель для каждого флажка.
Вот некоторый общий код для начала:
import java.awt.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class GetComponent extends JFrame
{
public GetComponent()
throws Exception
{
FileReader reader = new FileReader("form.html");
JEditorPane editor = new JEditorPane();
editor.setContentType( "text/html" );
editor.setEditable( false );
editor.read(reader, null);
JScrollPane scrollPane = new JScrollPane( editor );
scrollPane.setPreferredSize( new Dimension(400, 300) );
add( scrollPane );
setDefaultCloseOperation( EXIT_ON_CLOSE );
pack();
setLocationRelativeTo( null );
setVisible(true);
// display the attributes of the document
HTMLDocument doc = (HTMLDocument)editor.getDocument();
ElementIterator it = new ElementIterator(doc);
Element element;
while ( (element = it.next()) != null )
{
System.out.println();
AttributeSet as = element.getAttributes();
Enumeration enumm = as.getAttributeNames();
while( enumm.hasMoreElements() )
{
Object name = enumm.nextElement();
Object value = as.getAttribute( name );
System.out.println( "t" name " : " value );
if (value instanceof DefaultComboBoxModel)
{
DefaultComboBoxModel model = (DefaultComboBoxModel)value;
for (int j = 0; j < model.getSize(); j )
{
Object o = model.getElementAt(j);
Object selected = model.getSelectedItem();
System.out.print("tt");
if ( o.equals( selected ) )
System.out.println( o " : selected" );
else
System.out.println( o );
}
}
}
}
// display the components added to the editor pane
for (Component c: editor.getComponents())
{
Container parent = (Container)c;
System.out.println(parent.getComponent(0).getClass());
}
}
public static void main(String[] args)
throws Exception
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
GetComponent frame = new GetComponent();
}
catch(Exception e) { System.out.println(e); }
}
});
}
}
Ответ №2:
Я не думаю, что вы могли бы обрабатывать события javascript в JTextPane, поэтому я не думаю, что переключение флажка является вариантом.