2014-05-13 64 views
-1

我正在寫java擴展JPanel進行棋類遊戲。它的主要目標是給函數getXY另外一個類。當調用方法getXY時,它啓動一個新的線程,然後調用wait()。另一個線程向面板添加一個鼠標偵聽器,當用戶單擊面板時,它會計算座標和notify()面板,但會給出一個錯誤。如何在Java中等待一個用戶點擊?

這是類:

int spacesX; 
int spacesY; 
int panelWidth; 
int panelHeigth; 

    private int x; 
    private int y; 

public PannelloInputGriglia(int x, int y,int heigth,ChessModel model) 
{ 
    this.setBounds(x, y, (heigth/model.getHeight()*model.getWidth()), heigth); 
    spacesX = model.getWidth(); 
    spacesY = model.getHeight(); 
    panelWidth = this.getWidth(); 
    panelHeigth = this.getHeight(); 
    } 

    public void setX(int x) 
    { 
     this.x = x; 
    } 

    public void setY(int y) 
    { 
     this.y = y; 
    } 

    public Point getXY() 
    { 
     InputThread th = new InputThread(this); 
     try { 
      this.wait(); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(PannelloInputGriglia.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return new Point(x, y); 
    } 

    private class InputThread extends Thread 
    { 
     PannelloInputGriglia pannello; 
     public InputThread(PannelloInputGriglia p) 
     { 
      pannello = p; 
      start(); 
     } 

    @Override 
    public void run() { 
     pannello.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
     int sectorsX = panelWidth/spacesX; 
     int sectorsY = panelHeigth/spacesY; 
       setX(e.getX()/sectorsX); 
       setY(e.getY()/sectorsY); 
       super.mouseClicked(e); 
       pannello.notify(); 
      }  
     }); 
    } 
} 

我能做些什麼?

+0

你什麼錯誤? –

+0

您在等待函數之前沒有調用'synchronized(this)',因此不是所有者。 –

+0

對不起,我認爲這段代碼沒有被指定爲21日。世紀之久,你必須提供更多的信息,以便更快地發佈SSCCE/MCVE,更短的,可運行的,可編譯的 – mKorbel

回答

0

在代碼中沒有調用getXY()。

但是從您發佈的代碼,我想你應該:

  • 讀一些文件上的線程/ Runnable接口(Jenkov tutorial)。考慮在InputThread構造函數中調用start()方法的影響。
  • 閱讀Swing GUI的工作方式與螺紋加工(Swing multithreading