2012-02-20 207 views
3

嘗試將鼠標適配器添加到JButton中以右鍵單擊以標記該單元。問題是,當我將它實例化到按鈕上時,它不會讓我。也許是因爲它已經有一個actionlistener呢?我不太確定。任何幫助表示讚賞。我正在創建一個掃雷遊戲,fyi。右鍵單擊JButton

button = new JButton[size][size]; 
ButtonListener bl = new ButtonListener(); 
for (int r = 0; r < size; r++) { 
for (int c = 0; c < size; c++) { 
button[r][c] = new JButton(""); 
button[r][c].addActionListener(bl); 
button[r][c].addMouseListener (new MouseAdapter());`` 
// error message: cannot instantiate the type MouseAdapter 
panel.add(button[r][c]); 

最終是否可行,我想納入遊戲本:

button.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent e) { 
     if (e.getButton() == 3) { // if right click 
      button.setText("F"); 
      button.getModel().setPressed(false); 
      // button.setEnabled(true); 
     } else { 
      button.setText("X"); 
      button.getModel().setPressed(true); 
      // button.setEnabled(false); 
     } 
    } 
}); 
+0

@deporter你在說什麼?這是這個人的第一個問題... – 2012-02-20 23:00:33

+0

編譯器是你的朋友在這裏:爲什麼你會想要註冊一個do-nothing-mouseListener :-) – kleopatra 2012-03-09 10:27:44

回答

2

MouseAdapter是一個抽象類,不能創建它的實例。 這就是你得到錯誤的原因。

button[r][c].addMouseListener (new MouseAdapter()); // this will not work 

button[r][c].addMouseListener (new MouseAdapter(){}); // this will 
               ^

button[r][c].addMouseListener (new MouseAdapter(){ 
    public void mouseClicked(MouseEvent e){ 
     // and this will actually do sth. ;) 
    } 
}); 
+1

當場,好趕上:-) – kleopatra 2012-03-09 10:17:17

5

對於掃雷遊戲,你必須找

1)JToggleButton

2)添加到Icon方法JToggleButton

  • JToggleButton#setIcon();

  • JToggleButton#setSelectedIcon();

  • JToggleButton#setDisabledIcon();

3)添加到MouseListenerJToggleButton

4)與方法SwingUtilities.isRightMouseButton()重寫mouseClicked內部

結果可能是

enter image description hereenter image description hereenter image description here

從代碼

import java.awt.Insets; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JToggleButton; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class MyToggleButton extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon"); 
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon"); 
    private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon"); 

    public MyToggleButton() { 
     final JToggleButton toggleButton = new JToggleButton(); 
     toggleButton.setBorderPainted(false); 
     toggleButton.setBorder(null); 
     toggleButton.setFocusable(false); 
     toggleButton.setMargin(new Insets(0, 0, 0, 0)); 
     toggleButton.setContentAreaFilled(false); 
     toggleButton.setIcon((errorIcon)); 
     toggleButton.setSelectedIcon(infoIcon); 
     //toggleButton.setRolloverIcon((infoIcon)); 
     //toggleButton.setPressedIcon(warnIcon); 
     toggleButton.setDisabledIcon(warnIcon); 
     toggleButton.addMouseListener(new MouseListener() { 

      public void mouseClicked(MouseEvent e) { 
       if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) { 
        if (toggleButton.isEnabled()) { 
         toggleButton.setEnabled(false); 
        } else { 
         toggleButton.setEnabled(true); 
        } 
       } 
      } 

      public void mousePressed(MouseEvent e) { 
      } 

      public void mouseReleased(MouseEvent e) { 
      } 

      public void mouseEntered(MouseEvent e) { 
      } 

      public void mouseExited(MouseEvent e) { 
      } 
     }); 
     add(toggleButton); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MyToggleButton t = new MyToggleButton(); 
      } 
     }); 
    } 
} 
+0

+1,那是很有希望的,我需要這個想法:-) – 2012-04-27 07:33:18