2012-11-02 47 views
1

我有一個Java JApplet,它在eclipse運行時完美運行,但在瀏覽器中消失。 applet在瀏覽器中正常工作,直到只有JButton被按下。在這一點上,應該發生一些事情,但是,在瀏覽器中,除了按鈕顯示它已被按下之外,什麼也沒有發生。這在eclipse運行時不會發生。JApplet在瀏覽器中缺少全部功能

下面是代碼:

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控制檯時遇到了麻煩,但我相信錯誤可能是在剪貼板被訪問時。

+0

控制檯是否提到了有關查找'org.bukkit.configuration'類的問題? – trashgod

+0

@trashgod 如何在瀏覽器中查看控制檯?我之前找不到類的錯誤,但後來我修改了html。 – Hoolean

+1

因爲我真的沒有** org.bukkit.configuration **包,所以我不能測試這個。儘管查看代碼後的第一件事是,您從來沒有在EDT上調用過您的代碼 - 事件調度線程,這可能是您所指的內容的原因。請把'init()'方法的內容,即'makeGui()'放在'SwingUtilities.invokeLater(new Runnable(){makeGui()});'內,這樣可以爲你解決問題。有關更多信息,請參閱此[Java文檔](http://docs.oracle.com/javase/tutorial/uiswing/components/applet.html#thread) –

回答

1

出於安全原因,小程序可以通過兩種方式訪問​​剪貼板。

  1. 小應用程序由開發人員進行數字簽名,並由最終用戶信任。
  2. 該applet使用JNLP API的服務來訪問剪貼板。例如,可以在更新的JRE中獲得,比如Sun的1.6.0_10 +。

有可能獲得數據,其涉及

  • 直接使用戶糊到HTML表單字段
  • 然後使用JS將數據傳輸到該小程序的小程序一第三方式。

這可能會在沙盒裝小程序來完成,並支持JNLP API服務的JRE之前。 OTOH意味着更多的用戶點擊,以及更多的設置。 ?

//得到任何建議//

超越 '問一個更具體的問題:' 我可能還建議:

+0

太棒了!我會試試看!以防萬一你不知道的方式,'有任何建議?'位是代碼的一部分; D – Hoolean

+0

哦,是的,當搜索'?'時將我放入代碼中,然後在問題的下面,這表明您要麼不知道問題是什麼,要麼忘記提問。顯然你知道一個問題是什麼。將來,別忘了問一個。 (如果你不知道的話,這就是我***意義的一部分;) –

0

甲骨文發佈Java 6的更新24 2011年2月,以彌補21個漏洞。由於這種安全版本的一部分,從一臺計算機的剪貼板複製粘貼&到一個Java小程序的能力已被禁用。

要解決這個問題有兩個解決方案:

  1. 創建的小應用程序的數字簽名。
  2. 解決方法:如果你不想用數字簽名的工作,添加到您的java.policy文件中的以下行:許可java.awt中。的AWTPermission「accessClipboard」

如果你想看到的Java Applet的一個簽名證書就可以looke這裏(小程序接受來自剪貼板這是不允許未簽名的Applet粘貼操作)工作的一個例子:http://sqlinform.com/free_online_sw.html