摇摆鼠标按了更多的东西

时间:2016-02-16 12:59:44

标签: java swing

基本上这是我的代码的一部分:

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位置。嗯,在我的情况下,它不起作用,因为对于所有键,它打印相同,这是最后已知的&#39; r&#39; (的System.out.println(R))。你会怎么解释这个?

2 个答案:

答案 0 :(得分:2)

永远不要将MouseListener(或任何侦听器)添加到绘画方法中的组件。每次Swing重新绘制组件时,您都会添加另一个侦听器。

  

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

您永远不会为每个像素位置添加MouseListener。这不是MouseListener的工作方式。

相反,你:

  1. 创建一个矩形的ArrayList来表示每个钢琴键
  2. 您将一个MouseListener添加到您的组件
  3. 当生成MouseEvent时,您使用MouseEvent中的Point并使用Rectangle.contains(...)方法迭代矩形的ArrayList,以查看Rectangle是否包含鼠标点。如果是这样,那么你就做了自定义逻辑。

答案 1 :(得分: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();
    }
}

在这个例子中,一个字母打印到终端而不是正在播放的声音,它看起来不像钢琴,但JButtons可以看起来像钢琴键,它很容易让它正确播放声音。

修改

我改变了代码以使用MouseListener只是因为你非常想要使用它。除了MouseListenerJButton而不是ActionListener之外,它的工作方式相同。