2016-02-16 33 views
-1

Basicly這是我的代碼的一部分:的mousePressed鞦韆更多的東西

package Piano; 

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JPanel; 

@SuppressWarnings("serial") 
public class DrawingPanel extends JPanel 
{ 
int r = 0; 

public void paintComponent(Graphics g) 
{ 
    Graphics2D g2d = (Graphics2D) g; 

    g2d.setStroke(new BasicStroke(2.0f)); 

    for (int i = 60; i < 1800; i += 150) 
    { 
     drawKeys(g, i, 450, 150, 550); 
    }  
} 
public void drawKeys(Graphics g, int x, int y, int width, int height) 
{ 
    g.setColor(Color.WHITE); 
    g.fillRect(x, y, width, height); 
    g.setColor(Color.BLACK); 
    g.drawRect(x, y, width, height); 
    r++; 

    this.addMouseListener(new MouseAdapter() 
      { 
       public void mousePressed(MouseEvent e) 
       { 
        if (e.getX() > x && e.getX() < x + width && e.getY() > y && e.getY() < y + height) 
        { 
         System.out.println(r); 
        } 
       } 
      }); 
    } 
} 

,我想知道是否有可能增加在一個循環中的所有位置的mousePressed。那麼,在我的情況下,它不起作用,因爲對於所有鍵它打印相同,這是最後一個已知的'r'(System.out.println(r))。你會如何接受這個?

+0

你的意思是像一個座標列表? – Dan

+0

嗯,我正在製作一架鋼琴,所以我想檢測哪些鍵當前被按下,所以每個鍵都需要鼠標按下。 – pigi

+0

我的回答對你有幫助嗎? – Dan

回答

2

不要在繪畫方法中將MouseListener(或任何偵聽器)添加到組件。每次Swing重新繪製組件時,都會添加另一個偵聽器。

我想知道是否可以在一個循環中添加所有mousePressed位置。

您永遠不會爲每個像素位置添加一個MouseListener。這不是MouseListener的工作原理。

而是你:

  1. 創建矩形的ArrayList代表每個琴鍵
  2. 你添加一個單一的MouseListener到您的組件
  3. 當的MouseEvent生成您可以用點從的MouseEvent和使用Rectangle.contains(...)方法遍歷矩形的ArrayList以查看矩形是否包含鼠標點。如果是這樣,那麼你做你的自定義邏輯。
1

讓你在評論中說你可以做一些這樣的事情。爲每個密鑰創建一個JButton,或者最好爲所有密鑰創建一個JButton Array。爲他們全部添加一個動作偵聽器。然後當一個JButton被點擊播放相應的聲音。

一個簡單的例子

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import java.awt.FlowLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseEvent; 

public class GUITemplate { 
    private JFrame myMainWindow = new JFrame("This is my title"); 
    private JPanel firstPanel = new JPanel(); 
    private JButton a = new JButton("a"), b = new JButton("b"), c = new JButton("c"), d = new JButton("d"), e = new JButton("e"); 
    private CustomMouseListener cML = new CustomMouseListener(); 

    private void runGUI() {  
     myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myMainWindow.setLayout(new FlowLayout()); 
     createFirstPanel(); 
     myMainWindow.getContentPane().add(firstPanel); 
     myMainWindow.pack(); 
     myMainWindow.setVisible(true); 
    } 

    private void createFirstPanel() { 
     firstPanel.setLayout(new FlowLayout()); 

     firstPanel.add(a); 
     firstPanel.add(b); 
     firstPanel.add(c); 
     firstPanel.add(d); 
     firstPanel.add(e); 

     int panelComponents = firstPanel.getComponentCount(); 

     for(int i = 0;i<panelComponents;i++) { 
      if(firstPanel.getComponent(i) instanceof JButton) { 
       JButton temp = (JButton) firstPanel.getComponent(i); 
       temp.addMouseListener(cML); 
       firstPanel.getComponent(i).setFocusable(false); 
      } 
     } 
    } 

    private class CustomMouseListener extends MouseAdapter { 
     public void mousePressed(MouseEvent mE) { 
      if(mE.getSource() == a) { 
       System.out.println("a"); 
      } 

      if(mE.getSource() == b) { 
       System.out.println("b"); 
      } 

      if(mE.getSource() == c) { 
       System.out.println("c"); 
      } 

      if(mE.getSource() == d) { 
       System.out.println("d"); 
      } 

      if(mE.getSource() == e) { 
       System.out.println("e"); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     new GUITemplate().runGUI(); 
    } 
} 

在這個例子中,一個字母也印到終端,而不是一個聲音正在播放,它看起來一點也不像鋼琴,但可以作出這些Jbutton看起來像鋼琴鍵和它很容易讓它發揮正確的聲音。

編輯

我改變代碼使用MouseListener只是櫃面你拼命想用一個。除了你MouseListenerJButton而不是ActionListener以外,它的工作原理是一樣的。