如何在Java中等待一个用户点击?

时间:2014-05-13 11:48:23

标签: java multithreading swing

我'我在java中编写了一个扩展JPanel用于国际象棋游戏的类。它的主要目标是使用函数getXY为另一个类赋予一个点。调用getXY方法时,它会启动一个新的Thread,然后调用wait()。另一个线程向面板添加一个鼠标监听器,当用户单击面板时,它会计算坐标和notify()面板,但它会产生一个错误。

这是班级:

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();
            }    
        });
    }
}

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您的代码中没有调用getXY()。

但是根据您发布的代码,我认为您应该:

  • 阅读有关Threads / Runnable(Jenkov tutorial)的一些文档。想想在InputThread构造函数中调用start()方法的影响。
  • 阅读Swing GUI如何处理线程处理(Swing multithreading