Browser Java

Olá:

Alguém já usou as classes do pacote javax.swing.text.html? Criamos uma implementação do browser aqui na nossa empresa. Entretanto estamos enfrentando um problema: As bordas das tabelas não estão sendo exibidas. Significa que se fizermos algo como

<table border="1">
   <tr>
      <td>linha 1</td>
   </tr>
   <tr>
      <td>linha 2</td>
   </tr>
</table>

Os dados da tabela até aparecem, mas não sua borda.
Alguém sabe como contornar este problema? Seria um bug na implementação da Sun? Estamos usando o JDK 1.4.2. Haveria uma implementação alternativa e open-source de um browser HTML em Java?

Grato,

Tem como liberar os fontes?

Cara, não sei se esta informação ajuda, mas as classes desse pacote implementam a especificação HTML 2.0 :roll:

Dependendo do que vc quer fazer, talvez valha a pena antes de vc perder muito tempo, procurar um parser mais atualizado…

[quote=“om”]Cara, não sei se esta informação ajuda, mas as classes desse pacote implementam a especificação HTML 2.0 :roll:
[/quote]
Na verdade é a versão 3.2 do HTML (veja aqui). Pelo menos na JDK 1.4.
De qualquer forma descobri dois browsers: o Jazilla e o XBrowser. Baixei o código fonte do último e - apesar de ainda usar o pacote javax.swing.text.html - as bordas das tabelas são exibidas corretamente. Resta descobrir como poderia usá-lo.

Grato,

Olá:

Consegui corrigir meu problema. Partindo deste código, criei um novo código e então as bordas das tabelas apareceram. Segue-se o código caso algém queri brincar um pouco:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;

/**
 * @author rafael
 *
 */
public class TestEditorKit extends HTMLEditorKit {
    private JFrame frame;
    private String html;
    private boolean standAlone;

    /** My HTML document */
    private HTMLDocument m_document = null;

    /** The editor pane */
    private JEditorPane m_editorPane = null;

    /** The HTML edotor*/
    private HTMLEditorKit m_htmlEditor = null;

    public TestEditorKit() {
        this(false);
    }

    public TestEditorKit(boolean standAlone) {
        this.standAlone = standAlone;
        m_htmlEditor = new HTMLEditorKit();
        m_document = (HTMLDocument) m_htmlEditor.createDefaultDocument();
        m_editorPane = new JEditorPane();
        m_editorPane.setContentType("text/html");
        m_editorPane.setEditorKitForContentType("text/html", this);
        m_editorPane.setEditorKit(this);
        m_editorPane.setEditable(false);
        m_editorPane.setDocument(m_document);
        m_editorPane.setPreferredSize(new java.awt.Dimension(200, 200));

        // Definição do Frame
        this.frame = new JFrame();
        this.frame.getContentPane().add(this.getEditor());

        if (this.standAlone) {
            this.prepareStandAlone();
        }

        this.frame.pack();
        this.frame.setVisible(true);
    }

    private void prepareStandAlone() {
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JMenuBar menuBar = new JMenuBar();

        // Create a menu
        JMenu menu = new JMenu("Arquivo");
        menuBar.add(menu);

        JMenuItem mnuHtml = new JMenuItem("Entrar HTML");
        mnuHtml.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                String strHtml =
                    JOptionPane.showInputDialog(null, "Digite o Código HTML");
                if(strHtml != null) {
                    TestEditorKit.this.setHtml(strHtml);
                }
            }
        });
        menu.add(mnuHtml);

        menu.add(new JSeparator());

        JMenuItem mnuSair = new JMenuItem("Sair");
        mnuSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                System.exit(0);
            }
        });
        menu.add(mnuSair);


        // Install the menu bar in the frame
        frame.setJMenuBar(menuBar);
    }

    public JEditorPane getEditor() {
        return m_editorPane;
    }

    /**
     * @return
     */
    public String getHtml() {
        return html;
    }

    /**
     * @param string
     */
    public void setHtml(String string) {
        html = string;
        try {
            super.insertHTML(m_document, 0, html, 0, 0, HTML.Tag.HTML);
        } catch (BadLocationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void insertHTML(String text) {
        try {
            super.insertHTML(m_document, 0, text, 0, 0, HTML.Tag.HTML);
        } catch (BadLocationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     *
     */
    public void dispose() {
        if(!this.standAlone) {
            frame.dispose();
        }
    }

    public static void main(String[] args) {
        TestEditorKit testEditorKit = new TestEditorKit(true);
    }
}

o código foi testado cmo JDK 1.4 e 1.3.
Parece.me que a origem do problema estava no linha super.insertHTML(m_document, 0, html, 0, 0, HTML.Tag.HTML);. Mas isso é apenas minha suposição. :?

Grato,