Прослушивание флажков HTML в JTextPane (или альтернатива)?

#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.

В зависимости от вашего требования есть два способа сделать это:

  1. Компоненты Swing фактически добавляются на панель редактора. Итак, как только документ будет проанализирован и панель редактора будет повторно проверена (), вы сможете просто получить список всех компонентов, добавленных в панель редактора. Вы можете проверить имя класса, чтобы найти нужные компоненты.
  2. 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, поэтому я не думаю, что переключение флажка является вариантом.