2016-02-16 34 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以外,它的工作原理是一样的。