2011-10-31 2 views
2

Я использую редактируемую JTextPane для отображения некоторых данных в формате HTML. Я установил contentType в «text/html», и он работает. Теперь я хотел добавить флажки HTML в JTextPane и прослушать их изменения и получить возможность, если выбран конкретный checkBox. Это возможно?Прослушивание HTML-флажков в jTextPane (или альтернатива)?

Текст JTextPane в этом формате:

<html><form> 
<input type="checkbox" name="checkbox1" value="value" /> checkbox1<br /> 
</form></html> 

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

ответ

7

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

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

  1. компонента Свинг фактически добавлена ​​в панель редактора. Поэтому, как только документ будет проанализирован, а панель редактора будет проверена(), вы сможете просто получить список всех компонентов, добавленных в область редактора. Вы можете проверить имя класса, чтобы найти нужные компоненты.

  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("\t\t"); 

         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); } 
      } 
     }); 
    } 
} 
1

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