基本上这是我的代码的一部分:
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))。你会怎么解释这个?
答案 0 :(得分:2)
永远不要将MouseListener(或任何侦听器)添加到绘画方法中的组件。每次Swing重新绘制组件时,您都会添加另一个侦听器。
我想知道是否可以在一个循环中添加所有mousePressed位置。
您永远不会为每个像素位置添加MouseListener。这不是MouseListener的工作方式。
相反,你:
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
只是因为你非常想要使用它。除了MouseListener
到JButton
而不是ActionListener
之外,它的工作方式相同。