子コンポーネントを列挙してフォームにアクセス

見た目で分かるとおり、JEditorPaneにhtmlファイルを表示したときフォームの部品として使用されるのはswingコンポーネントです。 これらのコンポーネントはJEditorPaneの子をリストアップすればアクセスできます。

ただし、タグとコンポーネントの結びつきを調べる方法は限定されます。 submitボタンなどはテキストを確認すれば判別できます。 しかしその他のコンポーネントでこの方法は使えません。 表示される順番で特定することもできますが、あまり賢い方法ではないでしょう。 一応こんな事もできるよってことで紹介しますが、実際にコーディングするときは別の項目を参考にしてください。

子コンポーネントが追加されるタイミングについて、詳しくは調べていません。 JEditorPaneにsetPageした直後にはまだ子コンポーネントが構築されていません。 サンプルコードではJFrameが初めて表示されるときにリストアップしていますが、より適切なイベントがあるかもしれません。 興味のある方は調べてみてください。 ちなみにHTMLDocumentのDocumentEvent中にJEditorPaneに対してgetComponentsを使うと、そのスレッドは固まってしまいます。 別のイベントを探す必要がありそうです。

サンプルコード

以下はサンプルコードです。 読み込まれたhtmlに配置されたボタンを押すと、ボタンのテキストをダイアログで表示します。 htmlファイルなどはネタのトップからダウンロードしてください。 手抜きコードなのでJListに付いているスクロールバーのボタンなど、JButtonなら全て反応してしまいます。

// ChildrenTest.java
import java.io.File;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*;

public class ChildrenTest extends JFrame implements ActionListener
{
    public static final String TEST_HTML = "jeditorpane_test.html";
    public static final String TEST_CSS = "jeditorpane_test.css";
    
    private JEditorPane _editorPane;
    private WindowAdapter _windowAdapter = new WindowAdapter()
    {
        public void windowOpened(WindowEvent event)
        {
            checkChildComponents(_editorPane);
        }
    };
    
    public ChildrenTest()
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        try
        {
            _editorPane = new JEditorPane();
            _editorPane.setEditable(false);
            _editorPane.setContentType("text/html");
            
            HTMLEditorKit editorKit = (HTMLEditorKit)_editorPane.getEditorKit();
            editorKit.setAutoFormSubmission(false);
            File cssFile = new File(TEST_CSS);
            editorKit.getStyleSheet().importStyleSheet(cssFile.toURI().toURL() );
            
            File htmlFile = new File(TEST_HTML);
            _editorPane.setPage(htmlFile.toURI().toURL() );
            JScrollPane scrollPane = new JScrollPane(_editorPane);
            getContentPane().add(scrollPane);
            
            addWindowListener(_windowAdapter);
        }
        catch(Exception exc)
        {
            exc.printStackTrace();
        }
    }
    
    public static void main(String[] args)
    {
        ChildrenTest app = new ChildrenTest();
        app.setSize(640, 480);
        app.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent event)
    {
        JOptionPane.showMessageDialog(this, event.getActionCommand() );
    }
    
    private void checkChildComponents(Container container)
    {
        Component[] comps = container.getComponents();
        
        for(Component child : comps)
        {
            if(child instanceof JButton)
            {
                ( (JButton)child).addActionListener(this);
            }
            else if(child instanceof Container)
            {
                checkChildComponents( (Container)child);
            }
        }
    }
}