【问题标题】:JApplet lacking full functionality in browserJApplet 在浏览器中缺乏完整的功能
【发布时间】:2012-11-02 13:11:56
【问题描述】:

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

【问题讨论】:

  • 控制台是否提到任何关于查找org.bukkit.configuration 类的问题?
  • @trashgod 如何在浏览器中查看控制台?在找不到类之前出现错误,但后来我修改了 html。
  • 由于我真的没有 org.bukkit.configuration 包,所以我无法测试这个。尽管查看您的代码后的第一件事是,您从未在 EDT - 事件调度线程上调用过您的代码,但这可能是您所指的原因。请将您的init() 方法的内容,即makeGui() 像这样放在SwingUtilities.invokeLater(new Runnable() { makeGui()}); 中,这可能会为您解决问题。有关更多信息,请参阅此Java Doc
  • @GagandeepBali 关于invokeLater() 是正确的;您可以在平台的 Java 首选项中启用 Java 控制台。
  • “到那时,应该发生一些事情,” 究竟是什么?我可以尝试从您的代码中猜测,但我不喜欢猜测。顺便说一句,小程序是否经过数字签名?

标签: java swing clipboard jbutton japplet


【解决方案1】:

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

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

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

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

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

//有什么建议吗?//

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

  • 启用Java Console。该信息对于调试小程序至关重要。
  • 阅读Copy in sand-boxed app. in 1.6.0_24+ ,了解有关小程序中剪贴板访问问题的更多详细信息,以及使用 JS 和其他技术将数据复制到小程序的策略。李>

【讨论】:

  • 太棒了!我会试试看!以防万一你不知道,“有什么建议吗?”位是代码的一部分;D
  • 哦,是的,当搜索“?”时将我放到代码中,然后在问题下方,这表明您要么不知道问题是什么,要么忘了问一个问题。显然你知道什么是问题。以后,别忘了问一个。 (如果你不知道,那是 my 含义的一部分;)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多