7

JFileChooserをクリックしてファイルを選択するためにを開くアプレットを作成しましたJButton。Eclipseで実行すると正常に動作します。アプレット タグを使用して HTML ページに埋め込むと、ボタンをクリックしても何も起こりません。

JFileChooserブラウザで開かない理由についての提案をいただければ幸いですが、私の主な質問は、これをどのようにデバッグするかということです。Java コンソールを Firefox 3.6 または Chrome に追加する方法について、Google で何も見つけることができませんでした。JFileChooser が開かない理由について何らかの情報を取得する方法はありますか?

以下のコメントで回答されたデバッグ

そのため、コンソールには、アクセス拒否の例外があると表示されます。これは、アプレットに「署名」していないためだと思います。アプレットに署名する限り、開発プロセスはどうあるべきですか? ブラウザーでテストする前に、有効な CA によって発行された証明書で署名する必要がありますか、またはテスト中にできる簡単なことはありますか?

これが私のコードです:

package com.putapplet;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.URL;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;


@SuppressWarnings("serial")
public class PutToS3Applet extends JApplet {

    private static long maxFileSizeInBytes = 1048576;

    private static String listenerUrl = "xxx";
    private String listenerQueryString;

    private String signedPutUrl;

    private JProgressBar progressBar;
    private JButton button;
    private JLabel messageField;

    public void init() {

        setMaxFilesize(1);

        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {                    
                    createGUI();
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't complete successfully");
        }       
    }

    private void createGUI() {

        button = new JButton("Choose File...");
        button.addActionListener(new ButtonListener()); 

        progressBar = new JProgressBar(0, 100);
        progressBar.setStringPainted(true);

        messageField = new JLabel();
        //messageField.setPreferredSize(new Dimension(300, 20));

        FlowLayout layout = new FlowLayout();
        layout.setAlignment(FlowLayout.LEFT);

        JPanel topPanel = new JPanel();
        topPanel.setLayout(layout);

        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(layout);

        topPanel.add(button);
        topPanel.add(progressBar);
        bottomPanel.add(messageField);

        setLayout(new GridLayout(2,1));
        add(topPanel);
        add(bottomPanel);

    }

    class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent ae) {
            JFileChooser fileChooser = new JFileChooser();
            int showOpenDialog = fileChooser.showDialog(null, "Upload File");
            if (showOpenDialog != JFileChooser.APPROVE_OPTION) return;

            final File fileToUpload = fileChooser.getSelectedFile();

            if (fileToUpload.length() > PutToS3Applet.maxFileSizeInBytes) {
                messageField.setText("Your file must be smaller than " + getHumanReadableMaxFilesize());
                return;
            }

            listenerQueryString = "query[filename]=" + fileToUpload.getName();

            //get signed PUT url for s3
            try {

                URL listener = new URL(listenerUrl + listenerQueryString);
                BufferedReader in = new BufferedReader(new InputStreamReader(listener.openStream()));
                signedPutUrl = in.readLine().replace("http://", "https://");
                messageField.setText(signedPutUrl);

            } catch (Exception e) {             
                messageField.setText("Oops, there was a problem connecting to the server. Please try again.");
                e.printStackTrace();
            }
        }
    }

    private String getHumanReadableMaxFilesize() {
        return Long.toString((PutToS3Applet.maxFileSizeInBytes / 1024 / 1024)) + "MB";
    }

    private void setMaxFilesize(int sizeInMegaBytes) {
        PutToS3Applet.maxFileSizeInBytes = PutToS3Applet.maxFileSizeInBytes * sizeInMegaBytes;
    }
}

例外は次のとおりです。

Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:650)
at javax.swing.filechooser.FileSystemView.getHomeDirectory(FileSystemView.java:393)
at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(MetalFileChooserUI.java:253)
at javax.swing.plaf.basic.BasicFileChooserUI.installUI(BasicFileChooserUI.java:136)
at javax.swing.plaf.metal.MetalFileChooserUI.installUI(MetalFileChooserUI.java:126)
at javax.swing.JComponent.setUI(JComponent.java:662)
at javax.swing.JFileChooser.updateUI(JFileChooser.java:1763)
at javax.swing.JFileChooser.setup(JFileChooser.java:360)
at javax.swing.JFileChooser.<init>(JFileChooser.java:333)
at javax.swing.JFileChooser.<init>(JFileChooser.java:286)
at com.putapplet.PutToS3Applet$ButtonListener.actionPerformed(PutToS3Applet.java:82)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6289)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6054)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4652)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:603)
at java.awt.EventQueue$1.run(EventQueue.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:617)
at java.awt.EventQueue$2.run(EventQueue.java:615)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
4

5 に答える 5

11

補足です。アプレットのリモート デバッグはかなり簡単です。

リモート デバッグを許可するように Java プラグインを構成します。異なるプラットフォームでは異なる方法でそれを行いますが、Windows ではこのようなものになります。コントロール パネルを起動し、Java を選択します。VM オプションが見つかるまでクリックして、次の VM 引数を追加します。

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=6789,suspend=n

6789 がデバッグ ポートになります。

Eclipse でリモート デバッグを開始するには、次のようにします。デバッグ構成、リモート Java アプリケーション、新しい構成の作成。接続タイプとして標準 (ソケット接続) を選択し、アドレスとして locahost を入力し、ポートとして 6789 を入力します。

于 2011-05-18T18:22:11.040 に答える
2

Java コンソールを有効にすることを検討してください。これにより、すべての例外スタック トレースを表示できるようになり、デバッグが容易になることが期待されます。

また、「appletviewer」は、例外を表示できるようにするなど、ブラウザの外部でアプレットをテストするために設計されています。

于 2011-05-18T18:16:33.473 に答える
1

SecurityManager が許可していない可能性が非常に高いです。

FireFox では、[ツール] > [Java コンソール] に移動して Java コンソールを確認できます。Firefox はすでにセットアップされているはずです。

于 2011-05-18T18:17:09.557 に答える
0

アプレットを html ページに埋め込む場合は、アプレット jar ファイルに署名する必要があります。ドキュメント oracle docsを参照してください。

証明書を作成してから使用し、コマンドプロンプトで次のコマンドを入力します

jarsigner jarfilename.jar yourcertificatename
于 2013-05-04T22:12:30.437 に答える
0

ロギング ソリューション ( Log4jなど) を実装することも、検討する価値のある別のオプションです。これを起動して実行する方法に関するいくつかの簡単なチュートリアル

于 2011-05-18T18:21:26.993 に答える