1

我有一个 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 控制台时遇到问题,但我相信错误可能是在访问剪贴板时出现的。

4

2 回答 2

1

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

  1. 小程序由开发人员进行数字签名,并受到最终用户的信任。
  2. 小程序使用 JNLP API 的服务来访问剪贴板。这在最近的 JRE 中可用,例如 Sun 的 1.6.0_10+。

可能有第三种方法可以将数据获取到涉及的小程序

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

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

//有什么建议吗?//

除了“问一个更具体的问题”之外,我还可以建议:

于 2012-11-04T09:45:19.373 回答
0

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

要解决此问题,有 2 个解决方案:

  1. 为小程序创建数字签名。
  2. 解决方法:如果您不想使用数字签名,请在您的 java.policy 文件中添加以下行:permission java.awt.AWTPermission "accessClipboard"

如果您想查看使用签名证书的 Java Applet 示例,您可以在此处查看(小程序接受来自剪贴板的粘贴操作,不允许未签名的小程序):http ://sqlinform.com/free_online_sw.html

于 2013-01-08T14:04:26.957 回答