[Java] GUI 滑鼠左右鍵控制

前天想試試看把 Windows 經典的踩地雷寫出來,規則不多也有想法,就是卡在滑鼠點擊這個上面,方案換來換去終於完成

版本一,用 JButton 和 ActionListener

要點擊的地面,最初很直覺既然是按鍵的樣子就用 JButton 來做,造了 JButton[81] (以最簡單的 9x9 有 81 格),其中每個 JButton 都 addActionListener(JFrame),然後 JFrame.add(JButton) 都是在 for 中完成,然後 @override 中 for 裡 if(e.getSource()==JButton[i]){ } 去處理這些地被點擊該做的事,算蠻輕鬆的。

大概是:

public class MyFrame extends JFrame implements ActionListener {
  JButton button;
  MyFrame() {
      for(int i=0; i<81; i++) {
          button[i] = new JButton();
       //...
     }
  }
  @Override
  public void actionPerformed(ActionEvent e) {
      for(int i=0; i<81; i++) {
          if(e.getSource()==button[i]) {
          //...
          }
      }
  }
}

但是很快地發現我還有右鍵功能啊,找了一下似乎沒辦法,在 stackOverFlow 上發現也有人問同樣的問題,而且他也說他要做踩地雷 XD (不過我沒有去找過任何範本)從網友的回應得知可以從 MouseListener 中用 SwingUtilities.isRightMouseClick(e) 這個方向去解決。

版本二,用 JLabel 和 MouseListener

其實最早還是用 JButton 配 SwingUtilities.isRightMouseClick(),是後來想反正左鍵功能也要用 SwingUtilities 做了那就改 JLabel ,但又覺得 JButton 有個按下的回饋感還蠻不錯的,應該還會改回去。這個方案其實很快也發現行不通了,因為我找不到點擊後直接指定哪一塊地有動作。

大概是:

public class MyFrame extends JFrame implements ActionListener {
  JLabel label;
  MyFrame() {
      for(int i=0; i<81; i++) {
          label[i] = new JLabel();
          label[i].addMouseListener(new MouseListener() {
          //...
              @Override
              public void mousePressed(MouseEvent e) {
                  if(SwingUtilities.isRightClick(e) {
                      //...
                  }
              }
          //...
          }
      }
  }
}

我沒辦法在最裡面的 if 收到按下右鍵時,拿 i 來處理事情,被說 scope 看不到 i,超乎我想像。結果就是這方法行不通。

版本三,JFrame 和 MouseListener 配 getX() 和 getY()

最後是粗暴但可行的做法,就是仍然有 JLabel 畫地,但不是在 JLabel addMouseListener,而是在 JFrame 用,然後用 e.getX() 和 e.getY() 得到滑鼠坐標,經換算來得到指在哪一塊地。

大概是:

public class MyFrame extends JFrame implements ActionListener {
	MyFrame() {
		this.addMouseListener(new MouseListener() {
		//...
			@Override
			public void MousePressed(MouseEvent e) {
				int x = e.getX(), y = e.getY();
				//...
				if(SwingUtilities.isRightMouseClick(e) {
					//...
				}
			}
		//...
		}
	}
}

最後搞定了把左鍵右鍵功能都完成,但心裡就不是很踏實,深怕坐標換算後的編號的錯的,還好玩了一陣子是 OK 的。最後這個程式我還缺左右鍵一起按的功能還沒做出來,但我試了一下同時按的:

if(SwingUtilities.isLeftMouseClick(e) && SwingUtilities.isRightMouseClick(e)) {
	//...
}

行不通。也不能兩個 if :

if(SwingUtilities.isLeftMouseClick(e)) {
	if(SwingUtilities.isRightMouseClick(e) {
		//...
	}
}

也不行。希望有一天能找出答案來!

留言