Java 鼠标侦听器缺乏响应能力
Java mouse listener lacking responsiveness
我做了一点颜色 select 或使用 JPanels 和鼠标侦听器,但由于某些原因,结果没有预期的响应,我不知道为什么。
为了做到这一点,我创建了一个修改后的 JPanel,我称之为 ColorPanel,向它添加一些属性,例如颜色和颜色名称、内置鼠标侦听器、实例化时定义的背景颜色等:
public class ColorPanel extends JPanel{
private Color color;
private String sColor;
public ColorPanel(Color color, String sColor){
this.color = color;
this.sColor = sColor;
this.setBackground(color);
this.setBorder(BorderFactory.createLineBorder(Color.white));
this.addMouseListener(new appMouseListener());
ColorSelector.panSelector.add(this);
ColorSelector.vPanel.add(this);
}
public Color getColor(){
return this.color;
}
public String getScolor(){
return this.sColor;
}
class appMouseListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
ColorSelector.select((ColorPanel)e.getSource());
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
}
这与我制作的另一个对象相关联,旨在实例化我需要的所有面板及其计数器,以及更改 selected colorpanels 边框颜色并将其颜色存储到全局变量中的方法.
虽然它有效,但我经常需要点击几次才能 select 一个颜色面板。该程序之前没有响应问题,select或者是唯一出现这种情况的程序。
public static void select(ColorPanel colorPanel) {
IhmMap.SelectedColor = colorPanel.getColor();
IhmMap.SelectedScolor = colorPanel.getScolor();
for(int i = 0 ; i<vPanel.size(); i++ ){
vPanel.elementAt(i).setBorder(BorderFactory.createLineBorder(Color.white));
}
colorPanel.setBorder(BorderFactory.createLineBorder(Color.red.darker().darker()));
}
这是方法,所有的面板在创建时都添加到一个向量中,所以我可以轻松地操作它们。
仅当您在按下和释放鼠标之间根本没有移动鼠标时,才会触发 MouseClicked 事件。这样,如果您按下鼠标按钮并将鼠标稍微移动 1 个像素,则不会调用 mouseClicked。
我建议使用 mouseReleased 或 mousePressed、mouseReleased 的组合 and/or mouseExited。例如
private boolean pressed;
@Override
public void mouseExited(MouseEvent arg0) {
pressed = false;
}
@Override
public void mousePressed(MouseEvent arg0) {
pressed = true;
}
@Override
public void mouseReleased(MouseEvent arg0) {
if (pressed) {
//your code here
}
}
这样您就可以按下 ColorPanel,只要您不离开 ColorPanel,它就会记录一次点击。
我做了一点颜色 select 或使用 JPanels 和鼠标侦听器,但由于某些原因,结果没有预期的响应,我不知道为什么。
为了做到这一点,我创建了一个修改后的 JPanel,我称之为 ColorPanel,向它添加一些属性,例如颜色和颜色名称、内置鼠标侦听器、实例化时定义的背景颜色等:
public class ColorPanel extends JPanel{
private Color color;
private String sColor;
public ColorPanel(Color color, String sColor){
this.color = color;
this.sColor = sColor;
this.setBackground(color);
this.setBorder(BorderFactory.createLineBorder(Color.white));
this.addMouseListener(new appMouseListener());
ColorSelector.panSelector.add(this);
ColorSelector.vPanel.add(this);
}
public Color getColor(){
return this.color;
}
public String getScolor(){
return this.sColor;
}
class appMouseListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
ColorSelector.select((ColorPanel)e.getSource());
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
}
这与我制作的另一个对象相关联,旨在实例化我需要的所有面板及其计数器,以及更改 selected colorpanels 边框颜色并将其颜色存储到全局变量中的方法.
虽然它有效,但我经常需要点击几次才能 select 一个颜色面板。该程序之前没有响应问题,select或者是唯一出现这种情况的程序。
public static void select(ColorPanel colorPanel) {
IhmMap.SelectedColor = colorPanel.getColor();
IhmMap.SelectedScolor = colorPanel.getScolor();
for(int i = 0 ; i<vPanel.size(); i++ ){
vPanel.elementAt(i).setBorder(BorderFactory.createLineBorder(Color.white));
}
colorPanel.setBorder(BorderFactory.createLineBorder(Color.red.darker().darker()));
}
这是方法,所有的面板在创建时都添加到一个向量中,所以我可以轻松地操作它们。
仅当您在按下和释放鼠标之间根本没有移动鼠标时,才会触发 MouseClicked 事件。这样,如果您按下鼠标按钮并将鼠标稍微移动 1 个像素,则不会调用 mouseClicked。
我建议使用 mouseReleased 或 mousePressed、mouseReleased 的组合 and/or mouseExited。例如
private boolean pressed;
@Override
public void mouseExited(MouseEvent arg0) {
pressed = false;
}
@Override
public void mousePressed(MouseEvent arg0) {
pressed = true;
}
@Override
public void mouseReleased(MouseEvent arg0) {
if (pressed) {
//your code here
}
}
这样您就可以按下 ColorPanel,只要您不离开 ColorPanel,它就会记录一次点击。