右键单击setIcon()以标记炸弹 - 扫雷

时间:2012-07-19 23:29:41

标签: java swing mouselistener minesweeper jtogglebutton

我对编程很新,我正在尝试制作扫雷GUI。游戏工作完美正确点击JToggleButton在按钮上显示“B”炸弹,但当我用mouselistener中的setIcon()替换setText()时,它会在左右点击时显示图标。我在setText()时没有遇到这个问题。

    public void mousePressed(MouseEvent e){
        if(e.isMetaDown())
            if(btnPresses == 0)
            {
                startTime = System.currentTimeMillis();
                btnPresses++;
            }
            //if(btn[y][x].getText().equals("B"))
            if(btn[y][x].getIcon()==flag)
            {
                //btn[y][x].setText("");
                btn[y][x].setIcon(null);
                if(bombs[y][x]!=BOMB)
                    markers++;
            }
            else
            {
                //btn[y][x].setText("B");
                btn[y][x].setIcon(flag);
                if(bombs[y][x]==BOMB)
                    markers++;
                else
                    markers--;
            }

我在actionlistener中添加了一个btn [y] [x] .setIcon(null),这使得标志图标在左键单击时只会短暂显示,但我宁愿它根本不显示。

2 个答案:

答案 0 :(得分:2)

您需要区分鼠标左键单击,MouseEvent.BUTTON3和鼠标右键单击MouseEvent.BUTTON3,然后相应地执行操作。例如,当我做这样的事情时,我在我的模型中设置了“flag”布尔值(使用MVC):

@Override
public void mousePressed(MouseEvent e) {
   if (e.getButton() == MouseEvent.BUTTON3) {
      model.upDateButtonFlag();
   }
}

MouseListener只能用于设置或取消设置标志。否则,您应该让JButton通过其ActionListener响应左键单击。

答案 1 :(得分:0)

System.err.println("" + System.currentTimeMillis() + " " + e);添加到处理程序的开头。我强烈怀疑你的代码被调用次数比你想象的多 - 因为单击就可以生成多个事件。一旦你知道发生了什么,就应该很容易解决。