[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) { //... } }
也不行。希望有一天能找出答案來!
留言
張貼留言