JApplet缺乏浏览器的全部功能

时间:2012-11-02 13:11:57

标签: java swing clipboard jbutton japplet

我有一个Java JApplet,当eclipse运行它时可以很好地运行,但是在浏览器中会失效。 小程序在浏览器中工作正常,直到按下唯一的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?//";

     }


}

上面的代码有点过时了,我现在已经在'invoke later'代码中添加了!我无法显示Java控制台,但我相信错误可能是在访问剪贴板时。

2 个答案:

答案 0 :(得分:1)

出于安全原因,applet可以通过两种方式访问​​剪贴板。

  1. 小程序由开发人员进行数字签名,并受最终用户信任。
  2. applet使用JNLP API的服务来访问剪贴板。例如,在最新的JRE中可以使用,例如Sun的1.6.0_10 +。
  3. 可能有第三种方法将数据传递到涉及

    的applet
    • 让用户直接粘贴到HTML表单字段
    • 然后使用JS将数据传输到applet。

    这可以在沙盒小程序中完成,也可以在支持JNLP API服务的JRE之前完成。 OTOH意味着更多的用户点击次数,以及更多的设置。

      

    //有什么建议吗?//

    超越'问一个更具体的问题'我也可能会建议:

答案 1 :(得分:0)

Oracle于2011年2月发布了Java 6 Update 24,以解决21个漏洞。作为此安全版本的一部分,复制和发布的能力从计算机的剪贴板粘贴到Java小程序已被禁用。

要解决此问题,有两种解决方案:

  1. 为小程序创建数字签名。
  2. 解决方法:如果您不想使用数字签名,请在java.policy文件中添加以下行:permission java.awt.AWTPermission“accessClipboard”
  3. 如果您想查看使用签名证书的Java Applet示例,可以在此处进行操作(applet接受来自剪贴板的粘贴操作,不允许使用未签名的applet):http://sqlinform.com/free_online_sw.html