2009-10-23 97 views
0

我知道這裏有很多例子,但他們都覺得有點過時(即使是陽光文檔),所以我在這裏問,以確保我在做什麼是至今。我將如何去從java applet內部與javascript交談?簡單就像如何調用alert()是我正在尋找的。獎金積分的方式來檢查瀏覽器是否啓用了javascript(這個applet可以用在學校設置中,關閉javascript是一種真正的可能性)。所有幫助是極大的讚賞,在此先感謝...訪問來自java內部的JavaScript

代碼:

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import netscape.javascript.JSObject; 

public class TeamProject extends Applet implements ActionListener, MouseListener { 
    char[][] charValues = new char[10][10]; 
    Table aTable; 
    boolean allowUserInput = false; 
    Button BtnStart; 
    Button randomChangeBtn; 
    boolean guessMode; 
    JSObject jso; 

    public void init() { 
     //setup buttons 
     BtnStart = new Button("add row/column"); 
     BtnStart.addActionListener((ActionListener)this); //cast 
     randomChangeBtn = new Button("change one value"); 
     randomChangeBtn.addActionListener((ActionListener)this); 
     //add button 
     this.add(BtnStart); 
     //add image to Image objects 
     Image imgO = getImage(getCodeBase(), "images/not.gif"); 
     Image imgX= getImage(getCodeBase(), "images/cross.gif"); 
     //setup table 
     aTable = new Table(100, 100, 75, 55, 5, 5, imgX, imgO); 
     //setBackground(Color.LIGHT_GRAY); 
     super.resize(700, 700); 
     //add mouse listener 
     addMouseListener(this); 
     //initially guessMode will be false 
     guessMode = false; 
     //to talk to javascript 
     jso = JSObject.getWindow(this); 
    } 

    public void paint(Graphics g) { 
     g.setColor(Color.black); 
     aTable.draw(g); 
    } 

    //Mouse listener methods 
    public void mousePressed (MouseEvent e) { 
     if(!guessMode){ 
      if ((allowUserInput)) { //&&(aTable.isDrawable(e.getX(), e.getY()))) 
       aTable.swapSquareValue(e.getX(), e.getY()); 
       repaint(); 
      } 
     } else { 
      System.out.println("guessed row = " + e.getY() + " guessed col = " + e.getX()); 
      aTable.checkGuess(e.getX(), e.getY()); 
      //repaint(); 
     } 
    } 

    public void mouseClicked (MouseEvent e) {} 
    public void mouseEntered (MouseEvent e) {} 
    public void mouseReleased (MouseEvent e) {} 
    public void mouseExited (MouseEvent e) {} 

    //Button action listener 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == BtnStart) { 
      aTable.addRow(); 
      aTable.addColumn(); 
      this.remove(BtnStart); 
      this.add(randomChangeBtn); 
      repaint(); 
     } else if (e.getSource() == randomChangeBtn) { 
      //aTable.addRow(); 
      aTable.randomChangeFunc(); 
      repaint(); 
      guessMode = true; 
     } 
     allowUserInput = true; 
     System.out.println(aTable.toString()); 
    } 
} 

和我的表類:

import java.awt.*; 
import java.util.Random; 

public class Table { 
    private char[][]values = new char[10][10]; //probably better to use array of integer values(0 or 1) 
    Image imgO; 
    Image imgX; 
    private int Rows; 
    private int Columns; 
    private int BoxWidth ; 
    private int BoxHeight; 
    public Point Pos = new Point(); 

    private int tableHeight; 
    private int tableWidth; 

    private int changedRow; 
    private int changedCol; 

    //constructor 
    public Table(int x, int y, int width, int height, int col, int rows, Image X, Image O) { 
     Rows = rows; 
     Columns = col; 
     BoxWidth = width; 
     BoxHeight = height; 
     Pos.x = x; 
     Pos.y = y; 

     imgX = X; 
     imgO = O; 

     tableHeight = Rows*BoxHeight; 
     tableWidth = Columns*BoxWidth; 
     this.setValues(); 
    } 

    //draw table 
    public void draw(Graphics g) { 
     //draw vertical table lines 
     for (int i = 0 ; i <= Columns ; i++) 
      g.drawLine(i*BoxWidth + Pos.x, Pos.y, i*BoxWidth + Pos.x, tableHeight+Pos.y); 

     //draw horizontal table line 
     for(int i = 0 ; i <= Rows ; i++) 
      g.drawLine(Pos.x, i*BoxHeight + Pos.y, tableWidth+Pos.x, i*BoxHeight + Pos.y); 

     //draw values 
     drawValues(g); 
    } 

    public void swapSquareValue(int x, int y) { 
     if (this.isDrawable(x, y)) { 
      int col = this.getColumn(x)-1; 
      int row = this.getRow(y)-1; 

      if(values[row][col] == 'X') 
       values[row][col] = 'O'; 
      else if(values[row][col] == 'O') 
       values[row][col] = 'X'; 
      else 
       System.out.println("ERROR SWAPPING SQUARE VALUE"); 
     } else 
      System.out.println("says not drawable"); 
    } 

    public char getValue(int col, int row) { 
     return values[row][col]; 
    } 

    //return true if (x,y) is a point in the table 
    public boolean isDrawable(int x, int y) { 
     if((this.getRow(y)!=-1)||(this.getColumn(x)!=-1)) 
      return true; 
     else 
      return false; 
    } 

    public void addRow() { 
     Rows++; 
     tableHeight = (Rows*BoxHeight); 
     int numOfXs = 0; 
     for (int c=0; c < Columns; c++) { 
      numOfXs = 0; 
      for(int r = 0; r < Rows - 1; r++) { 
       if(values[r][c] == 'X'){ 
        numOfXs++; 
        System.out.println("in column " + c + "new x found at " + r + " " + c + ", numOfXs = " + numOfXs); 
       } 
       if(numOfXs % 2 == 0) { 
        values[Rows - 1][c] = 'O'; 
       } else{ 
        values[Rows - 1][c] = 'X'; 
       } 
      }//end inner for 
      System.out.println("end of column " + c); 
     }//end outer for 
    }// end function 

    public void addColumn() { 
     Columns++; 
     tableWidth = (Columns*BoxWidth); 
     int numOfXs = 0; 

     for (int r=0; r < Rows; r++) { 
      numOfXs = 0; 
      for(int c = 0; c < Columns - 1; c++) { 
       if(values[r][c] == 'X') { 
        numOfXs++; 
        System.out.println("in row " + r + "new x found at " + r + " " + c + ", numOfXs = " + numOfXs); 
       } 
       if(numOfXs % 2 == 0) { 
        values[r][Columns - 1] = 'O'; 
       } 
       else { 
        values[r][Columns - 1] = 'X'; 
       } 
      }//end inner for 
      System.out.println("end of row " + r); 
     } 
    } 

    //does not add or remove values 
    public void setColumn(int col) { 
     Columns = col; 
     tableWidth = (Columns*BoxWidth); 
    } 

    //does not add or remove values 
    public void setRows(int row) { 
     Rows = row; 
     tableHeight = (row*BoxHeight); 
    } 

    public String toString() { 
     String ValueString = "Displaying charValues[" + Rows + "][" + Columns + "]\n"; 
     for (int r=0; r < Rows; r++) { 
      for (int c=0; c < Columns; c++) { 
       ValueString += (char)values[r][c]; 
      } 
      ValueString += "\n";  //next line 
     } 
     return ValueString; 
    } 

    private void drawValues(Graphics g) { 
     Point drawPoint = new Point(); 
     for (int r=0; r < Rows; r++) 
      for (int c=0; c < Columns; c++) { 
       drawPoint.x = Pos.x+BoxWidth*c; 
       drawPoint.y = Pos.y+BoxHeight*r; 
       //g.setColor(Color.white); 
       //g.fillRect(drawPoint.x+1, drawPoint.y+1, BoxWidth-1, BoxHeight-1); 
       if (values[r][c] == 'X') { 
        g.drawImage(imgX,drawPoint.x+1, drawPoint.y+1, BoxWidth-1, BoxHeight-1, null); 
       } else { 
        g.drawImage(imgO,drawPoint.x+1, drawPoint.y+1, BoxWidth-1, BoxHeight-1, null); 
       } 
       //System.out.print((char)values[r][c]); 
      } 
     g.setColor(Color.black); 
    } 

    //fills array with random values 
    private void setValues() { 
     for (int r=0; r < Rows; r++) 
      for (int c=0; c < Columns; c++) { 
       values[r][c] = this.randomChar(); 
      } 
    } 

    //randomly return 'X' or 'O' 
    private char randomChar() { 
     char randomValue; 
     Random RandomGen = new Random(); 

     if (RandomGen.nextInt(2)==0) 
      randomValue = 'O'; 
     else 
      randomValue ='X'; 
     return randomValue; 
    } 

    private int getColumn(int x) { 
     int offsetx=0; 
     for (int i = 0 ; i < Columns ; i++) { 
      offsetx = i*BoxWidth; 
      if((x>Pos.x+offsetx)&& (x<Pos.x+offsetx+BoxWidth)) 
       return i+1; 
     } 
     return -1; 
    } 

    private int getRow(int y) { 
     int offsety=0; 
     for (int i = 0 ; i < Rows ; i++) { 
      offsety = i*BoxHeight; 
      if((y>Pos.y+offsety)&& (y<Pos.x+offsety+BoxHeight)) 
       return i+1; 
     } 
     return -1; 
    } 

    public void randomChangeFunc() { 
     //get random row and column 
     Random rand=new Random(); 

     int randRow = rand.nextInt(Rows); 
     int randCol = rand.nextInt(Columns); 

     System.out.println("randRow = " + randRow + " randCol = " + randCol); 
     /*THIS SHOULD BE HANDLED BY swapSquareValue(randCol,randRow) 
     /*BUT GETTING ERRORS (notDrawable). THE FOLLOWING CODE IS A WORK-AROUND 
     */ 
     if(values[randRow][randCol] == 'X') 
      values[randRow][randCol] = 'O'; 
     else if(values[randRow][randCol] == 'O') 
      values[randRow][randCol] = 'X'; 
     else 
      System.out.println("ERROR SWAPPING SQUARE VALUE"); 
     //set globals 
     changedRow = randRow; 
     changedCol = randCol; 
    } 

    public void checkGuess(int guessCol, int guessRow){ 
     int gCol = this.getColumn(guessCol)-1; 
     int gRow = this.getRow(guessRow)-1; 
     System.out.println("gCol = " + gCol + " gRow = " + gRow); 
     if(gCol == changedCol && gRow == changedRow) { 
      System.out.println("CORRECT!!!"); 
     } else 
      System.out.println("incorrect :("); 
    } 
} 

更改我的javac命令:

javac -classpath /usr/lib/Java6u1/jre/lib/plugin.jar TeamProject.java 

忽略我的「表」類,並且我提到了這個錯誤。有任何想法嗎?

+0

要做一些最新的事情,你不應該創建一個小程序 – 2009-10-23 08:46:51

+0

你能詳細說明嗎?該請求是針對一個applet的,所以我不打算改變它。如果我按照自己的方式,我會完成整個事情w/javascript,但這不是他們要求的... – danwoods 2009-10-23 08:52:43

+0

好的!修正了查找netscape類的問題,但現在javac找不到我在主類文件之外編寫的類... – danwoods 2009-10-23 09:41:03

回答

3

this article。如果試圖從applet的這個網頁它絕對適用於調用JS,因爲有更新的動作後,JS例外,從applet的:)

import netscape.javascript.JSObject

public void init() { jso = JSObject.getWindow(this); }

public void actionPerformed(ActionEvent e) { 
    if(jso != null) 
     try { 
       jso.call("updateWebPage", new String[] {txt.getText()}); 
      } 
      catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
} 

編輯: 對於classpath問題你需要添加plugin.jar到你的類路徑,它位於%JAVA_HOME%\ jre \ lib \ plugin.jar中

EDIT2:
我認爲你的問題是,一個類Table未編譯過:

嘗試javac -classpath /usr/lib/Java6u1/jre/lib/plugin.jar TeamProject.java Table.java或使用通配符像*.java

也許你應該考慮使用IDE如EclipseNetbeans來編譯和運行項目,而不是用命令行工具掙扎。

+0

使用javac -classpath%JAVA_HOME%\ jre \ lib \ plugin.jar TeamProject.java不修復任何問題,javac -classpath也不修復/usr/lib/Java6u1/jre/lib.plugin.jar TeamProject.java – danwoods 2009-10-23 09:31:34

+0

好吧!修正了查找netscape類的問題,但是現在javac找不到我在主類文件之外編寫的類... – danwoods 2009-10-23 09:41:43

+0

那麼你有java安裝問題。另一方面是這個代碼不會編譯。沒有班級表格。爲什麼要導入awt包和swing包?這個例子來自哪裏? – cetnar 2009-10-23 09:47:58

0

按照要求在頁面中調用警報的示例將其嵌入(在Opera 10.01,FF 3.5.4,IE6中測試)。

注意MAYSCRIPT在applet標記,這MUST存在,以使Java的JavaScript的通信。由於安全原因,默認情況下對JSObject的訪問被禁用。

HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>Test</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
    <applet code="HelloWWW.class" width="300px" height="100px" MAYSCRIPT></applet> 
</body> 
</html> 

的Java(與javac -cp .;[pathtojre]/jre/lib/plugin.jar HelloWWW.java編譯)

import java.awt.*; 
import java.applet.*; 
import java.awt.event.*; 
import netscape.javascript.*; 

public class HelloWWW extends Applet implements ActionListener { 
    Button runButton; 
    public void init() { 
    runButton = new Button("Run: alert(\"Hello WWW\")"); 
    add(runButton); 
    runButton.addActionListener(this); 
    } 
    public void actionPerformed(ActionEvent evt) { 
    if (evt.getSource() == runButton) { 
     try { 
     //get JSOBject 
     JSObject jso = JSObject.getWindow(this); 
     //call alert with parameter passed as Object array 
     jso.call("alert", new Object[]{"Hello WWW"}); 
     } catch (JSException e) { 
     e.printStackTrace(); 
     } 
     runButton.setLabel("Did it!"); 
     repaint(); 
    } 
    } 
} 

還要檢查Java-to-Javascript CommunicationMozilla Dev: JSObject進一步的信息。