1

我对编程很陌生,正在尝试制作扫雷 GUI。游戏运行完美,右键单击 JToggleButton 在按钮上显示“B”代表炸弹,但是当我在 mouselistener 中将 setText() 替换为 setIcon() 时,它会在左右单击时显示图标。我在 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),这会导致标志图标在左键单击时仅短暂出现,但我宁愿它根本不出现。

4

2 回答 2

2

您需要区分鼠标左键单击 MouseEvent.BUTTON3 和鼠标右键单击 MouseEvent.BUTTON3,然后采取相应措施。例如,当我做这样的事情时,我通过以下方式在我的模型中设置“标志”布尔值(使用 MVC):

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

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

于 2012-07-20T01:20:25.600 回答
0

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

于 2012-07-20T01:00:36.353 回答