MouseListener 在运行时开始出错
MouseListener starts giving errors mid-runtime
我目前正在制作一款涉及通过 JPanel 制作的按钮的游戏。但是,在程序运行期间的某个时刻,每当以以下形式注册鼠标事件时,用于制作按钮的 JPanel 开始不断出现错误:
at java.awt.AWTEventMultiCaster.mouse[eventName](UnknownSource)
速度太快了,我看不到初始错误,而且错误只在运行中期的某个时间点开始。有人可以帮我吗?以下是我的 JPanel 的代码:
JPanel trackPanel = new JPanel() {
int state = 0;
@Override
protected void paintComponent(Graphics g) {
super.paintComponents(g);
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
if (dragMe == null) {
state = 1;
}
}
public void mouseExited(MouseEvent e) {
if (dragMe == null) state = 0;
else state = 1;
}
public void mousePressed(MouseEvent e) {
if (dragMe == null && !e.isMetaDown())
{
dragMe = new DragFrameThread(vTrack);
dragMe.start();
}
state = 2;
}
public void mouseReleased(MouseEvent e) {
if (state == 2 && e.isMetaDown()) System.exit(0);
if (dragMe != null) {
dragMe.interrupt();
dragMe = null;
state = 1;
}
}
});
g.setColor(new Color(0, 127, 127, 255));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
g.setColor(new Color(0, 127, 127, 223));
g.drawRect(1, 1, getWidth()-3, getHeight()-3);
g.setColor(new Color(0, 127, 127, 191));
g.drawRect(2, 2, getWidth()-5, getHeight()-5);
g.setColor(new Color(0, 127, 127, 159));
g.fillRect(3, 3, getWidth()-6, getHeight()-6);
g.drawImage(BootAssets.VTScaledLogo, 0, 0, getWidth(), getHeight(), null);
if (state == 1) g.setColor(new Color(255, 255, 255, 127));
if (state == 2) g.setColor(new Color(0, 0, 0, 127));
if (state != 0) g.fillRect(0, 0, getWidth(), getHeight());
repaint();
}
};
非常感谢!
~段
我认为问题在于绘制小部件时调用了 paintComponent
方法。在每个绘制调用上添加鼠标侦听器是错误的。
将addMouseListener移出paintComponent方法,单独添加到trackPanel中。您将需要重构代码,因为它当前已按照 JPanel 的定义方式设置和更新状态。
private final AtomicInteger state = new AtomicInteger(0);
JPanel trackPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(new Color(0, 127, 127, 255));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
g.setColor(new Color(0, 127, 127, 223));
g.drawRect(1, 1, getWidth()-3, getHeight()-3);
g.setColor(new Color(0, 127, 127, 191));
g.drawRect(2, 2, getWidth()-5, getHeight()-5);
g.setColor(new Color(0, 127, 127, 159));
g.fillRect(3, 3, getWidth()-6, getHeight()-6);
g.drawImage(BootAssets.VTScaledLogo, 0, 0, getWidth(), getHeight(), null);
if (state.get() == 1) g.setColor(new Color(255, 255, 255, 127));
if (state.get() == 2) g.setColor(new Color(0, 0, 0, 127));
if (state.get() != 0) g.fillRect(0, 0, getWidth(), getHeight());
}
};
trackPanel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
if (dragMe == null) {
state.set(1);
}
}
public void mouseExited(MouseEvent e) {
if (dragMe == null) state.set(0);
else state.set(1);
}
public void mousePressed(MouseEvent e) {
if (dragMe == null && !e.isMetaDown())
{
dragMe = new DragFrameThread(vTrack);
dragMe.start();
}
state.set(2);
}
public void mouseReleased(MouseEvent e) {
if (state.get() == 2 && e.isMetaDown()) System.exit(0);
if (dragMe != null) {
dragMe.interrupt();
dragMe = null;
state.set(1);
}
}
});
我目前正在制作一款涉及通过 JPanel 制作的按钮的游戏。但是,在程序运行期间的某个时刻,每当以以下形式注册鼠标事件时,用于制作按钮的 JPanel 开始不断出现错误:
at java.awt.AWTEventMultiCaster.mouse[eventName](UnknownSource)
速度太快了,我看不到初始错误,而且错误只在运行中期的某个时间点开始。有人可以帮我吗?以下是我的 JPanel 的代码:
JPanel trackPanel = new JPanel() {
int state = 0;
@Override
protected void paintComponent(Graphics g) {
super.paintComponents(g);
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
if (dragMe == null) {
state = 1;
}
}
public void mouseExited(MouseEvent e) {
if (dragMe == null) state = 0;
else state = 1;
}
public void mousePressed(MouseEvent e) {
if (dragMe == null && !e.isMetaDown())
{
dragMe = new DragFrameThread(vTrack);
dragMe.start();
}
state = 2;
}
public void mouseReleased(MouseEvent e) {
if (state == 2 && e.isMetaDown()) System.exit(0);
if (dragMe != null) {
dragMe.interrupt();
dragMe = null;
state = 1;
}
}
});
g.setColor(new Color(0, 127, 127, 255));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
g.setColor(new Color(0, 127, 127, 223));
g.drawRect(1, 1, getWidth()-3, getHeight()-3);
g.setColor(new Color(0, 127, 127, 191));
g.drawRect(2, 2, getWidth()-5, getHeight()-5);
g.setColor(new Color(0, 127, 127, 159));
g.fillRect(3, 3, getWidth()-6, getHeight()-6);
g.drawImage(BootAssets.VTScaledLogo, 0, 0, getWidth(), getHeight(), null);
if (state == 1) g.setColor(new Color(255, 255, 255, 127));
if (state == 2) g.setColor(new Color(0, 0, 0, 127));
if (state != 0) g.fillRect(0, 0, getWidth(), getHeight());
repaint();
}
};
非常感谢! ~段
我认为问题在于绘制小部件时调用了 paintComponent
方法。在每个绘制调用上添加鼠标侦听器是错误的。
将addMouseListener移出paintComponent方法,单独添加到trackPanel中。您将需要重构代码,因为它当前已按照 JPanel 的定义方式设置和更新状态。
private final AtomicInteger state = new AtomicInteger(0);
JPanel trackPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(new Color(0, 127, 127, 255));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
g.setColor(new Color(0, 127, 127, 223));
g.drawRect(1, 1, getWidth()-3, getHeight()-3);
g.setColor(new Color(0, 127, 127, 191));
g.drawRect(2, 2, getWidth()-5, getHeight()-5);
g.setColor(new Color(0, 127, 127, 159));
g.fillRect(3, 3, getWidth()-6, getHeight()-6);
g.drawImage(BootAssets.VTScaledLogo, 0, 0, getWidth(), getHeight(), null);
if (state.get() == 1) g.setColor(new Color(255, 255, 255, 127));
if (state.get() == 2) g.setColor(new Color(0, 0, 0, 127));
if (state.get() != 0) g.fillRect(0, 0, getWidth(), getHeight());
}
};
trackPanel.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
if (dragMe == null) {
state.set(1);
}
}
public void mouseExited(MouseEvent e) {
if (dragMe == null) state.set(0);
else state.set(1);
}
public void mousePressed(MouseEvent e) {
if (dragMe == null && !e.isMetaDown())
{
dragMe = new DragFrameThread(vTrack);
dragMe.start();
}
state.set(2);
}
public void mouseReleased(MouseEvent e) {
if (state.get() == 2 && e.isMetaDown()) System.exit(0);
if (dragMe != null) {
dragMe.interrupt();
dragMe = null;
state.set(1);
}
}
});