1

Eclipse で実行すると完全に機能する Java JApplet がありますが、ブラウザーではがっかりします。アプレットは、JButton のみが押される時点までブラウザで正常に動作しています。その時点で何かが起こるはずですが、ブラウザーでは、ボタンが押されたことを示す以外は何も起こりません。これは、Eclipse が実行する場合には発生しません。

コードは次のとおりです。

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JTextArea;

import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;

public class OverviewGenerator extends JApplet {

    int state = 0;
    JTextArea label = new JTextArea();
    JButton button = new JButton();

    String pluginYML;

    YamlConfiguration yml = new YamlConfiguration();

    String page;

    public ActionListener buttonListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            if(state == 0) {

                try {
                    pluginYML = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
                } catch (HeadlessException e1) {
                    e1.printStackTrace();
                } catch (UnsupportedFlavorException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                try {
                    yml.loadFromString(pluginYML);
                } catch (InvalidConfigurationException e1) {
                    e1.printStackTrace();
                }
                state = 1;

            }else {

                generatePage();

                Toolkit toolkit = Toolkit.getDefaultToolkit();
                Clipboard clipboard = toolkit.getSystemClipboard();
                StringSelection strSel = new StringSelection(page);
                clipboard.setContents(strSel, null);

                state = 0;

            }

            refreshComponents();

        }

    };

    /**
     * 
     */
     private static final long serialVersionUID = 3470279389867972761L;

     public void init() {

         makeGui();

     }

     private void makeGui() {

         label.setWrapStyleWord(true);
         label.setLineWrap(true);
         label.setBackground(Color.CYAN);
         label.setEditable(false);

         GridLayout layout = new GridLayout();
         layout.setRows(2);
         layout.setColumns(1);

         getContentPane().setLayout(layout);

         refreshComponents();

         getContentPane().add(label);
         getContentPane().add(button);

         button.addActionListener(buttonListener);

     }

     private void refreshComponents() {

         if(state==0) {

             label.setText("Copy your plugin.yml into the clipboard then press done!");
             button.setText("Done");

         }else if(state == 1) {

             label.setText("Now press the button to copy your template BukkitDev overview into your clipboard!");
             button.setText("Copy");

         }

     }

     private void generatePage() {

         page = "";

         page += "== "+yml.getString("name")+" ==\n";

         if(yml.contains("description")) {

             page += "\n//"+yml.getString("description")+"//\n\n\n";

         }

         if(yml.contains("commands")) {

             page += "== Commands ==\n";

             for(String command : yml.getConfigurationSection("commands").getKeys(false)) {

                 page += "\n=== "+command+" ===\n\n";

                 if(yml.contains("commands."+command+".description")) {

                     page += "//"+yml.getString("commands."+command+".description")+"//\n";

                 }

                 if(yml.contains("commands."+command+".usage")) {

                     page += "Usage: "+yml.getString("commands."+command+".usage")+"\n";

                 }

             }

             page += "\n";

         }

         if(yml.contains("permissions")) {

             YamlConfiguration editedYml = new YamlConfiguration();
             try {
                editedYml.loadFromString(pluginYML.replace(".", "≠"));
            } catch (InvalidConfigurationException e) {
                e.printStackTrace();
            }

             ConfigurationSection permissions = editedYml.getConfigurationSection("permissions");

             page += "== Permissions ==\n";

             for(String permission : permissions.getKeys(false)) {

                 page += "\n=== "+permission.replace('≠', '.')+" ===\n\n";

                 if(editedYml.contains("permissions."+permission+".description")) {

                     page += "//"+editedYml.getString("permissions."+permission+".description").replace('≠', '.')+"//\n";

                 }

             }

             page += "\n\n\n";

         }

         page += "//Got any suggestions?//";

     }


}

上記のコードは少し古くなっています。「後で呼び出す」コードを追加しました。Java コンソールの表示に問題がありますが、クリップボードにアクセスしたときにエラーが発生した可能性があります。

4

2 に答える 2

1

セキュリティ上の理由から、アプレットがクリップボードにアクセスする方法は2つあります。

  1. アプレットは開発者によってデジタル署名され、エンドユーザーによって信頼されます。
  2. アプレットは、JNLPAPIのサービスを使用してクリップボードにアクセスします。これは、最近のJRE、たとえばSunの1.6.0_10+で利用できます。

アプレットにデータを取得するための3番目の方法が含まれる可能性があります

  • ユーザーにHTMLフォームフィールドに直接貼り付けさせる
  • 次に、JSを使用してデータをアプレットに転送します。

これは、サンドボックス化されたアプレットで、JNLPAPIサービスをサポートするJREの前に実行できます。OTOHは、ユーザーのクリック数と設定数が増えることを意味します。

//何か提案がありますか?//

「より具体的な質問をする」を超えて、私も提案するかもしれません:

于 2012-11-04T09:45:19.373 に答える
0

Oracle は 2011 年 2 月に Java 6 Update 24 をリリースし、21 の脆弱性を修正しました。このセキュリティ リリースの一環として、コンピュータのクリップボードから Java アプレットにコピー アンド ペーストする機能が無効になりました。

この問題を解決するには、次の 2 つの解決策があります。

  1. アプレットのデジタル署名を作成します。
  2. 回避策: デジタル署名を使用したくない場合は、java.policy ファイルに次の行を追加してください。

署名された証明書で動作する Java アプレットの例を見たい場合は、ここを参照してください (アプレットは、署名されていないアプレットには許可されていないクリップボードからの貼り付けアクションを受け入れます): http://sqlinform.com/free_online_sw.html

于 2013-01-08T14:04:26.957 に答える