import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URL; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; public class SimpleBrowser { private JDialog dialog; private JTextField urlField; private JEditorPane page; public SimpleBrowser(JFrame parent, URL url) { try { dialog = new JDialog(parent, url.toExternalForm()); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setSize(800, 800); // URL を表示するためのテキストフィールド JPanel panel = new JPanel(); urlField = new JTextField(url.toExternalForm()); urlField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { go(); } }); JButton goButton = new JButton("Go"); goButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { go(); } }); panel.setLayout(new BorderLayout()); panel.add(new JLabel("URL: "), BorderLayout.WEST); panel.add(urlField, BorderLayout.CENTER); panel.add(goButton, BorderLayout.EAST); dialog.getContentPane().add(panel, BorderLayout.NORTH); // HTML を表示するために JEditorPane を使用する // JEditorPane は HTML3.2 までしか解釈できないので、 // 正しく表示できないページも多い page = new JEditorPane(url); page.setEditable(false); page.setCaretPosition(0); // ハイパーリンクの設定 page.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent event) { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { hyperlinkActivated(event.getURL()); } } }); dialog.getContentPane().add(new JScrollPane(page), BorderLayout.CENTER); JButton closeButton = new JButton("閉じる"); closeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { dialog.dispose(); } }); panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.RIGHT)); panel.add(closeButton); dialog.getContentPane().add(panel, BorderLayout.SOUTH); } catch (IOException ex) { showErrorMessage(url.toExternalForm()); } } public void show() { dialog.setVisible(true); } // テキストフィールドもしくは「Go」ボタンを押されたときの処理 private void go() { String url = urlField.getText(); try { dialog.setTitle(url); page.setPage(url); page.setCaretPosition(0); } catch (IOException ex) { showErrorMessage(url); } } // ハイパーリンクの処理 // リンク先の HTML を表示する private void hyperlinkActivated(URL url) { try { dialog.setTitle(url.toExternalForm()); urlField.setText(url.toExternalForm()); page.setPage(url); page.setCaretPosition(0); } catch (IOException ex) { showErrorMessage(url.toExternalForm()); } } private void showErrorMessage(String url) { JOptionPane.showMessageDialog(dialog, url + " の表示ができません", "Error", JOptionPane.ERROR_MESSAGE); } }