缺乏响应能力的 Java 鼠标监听器

标签 java swing mouselistener responsiveness

我使用 JPanel 和鼠标监听器制作了一个小颜色选择器,但出于某种原因,结果没有预期的那么灵敏,我也不知道为什么。

custom color selector

为了做到这一点,我创建了一个修改后的 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

    }

}

这与我制作的另一个对象相关联,旨在实例化我需要的所有面板及其计数器,以及更改所选颜色面板边框颜色并将其颜色存储到全局变量中的方法。

虽然它有效,但我经常需要点击几次才能选择一个颜色面板。该程序之前没有响应性问题,选择器是唯一以这种方式运行的。

    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()));



}

这是方法,所有面板在创建时都添加到 vector 中,因此我可以轻松操作它们。

最佳答案

只有当您在按下和释放鼠标之间根本没有移动鼠标时,才会触发 MouseClicked 事件。这样,如果您按下鼠标按钮并将鼠标稍微移动 1 个像素,则不会调用 mouseClicked。

我建议使用 mouseReleased 或 mousePressed、mouseReleased 和/或 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,它就会记录一次点击。

关于缺乏响应能力的 Java 鼠标监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32451591/

相关文章:

java - 异常说明 "Resetting to invalid mark "在标记 inputStream 并重置它时出现,对于大文件。?

java - 使用可变参数绘制星形

java - 未检测到 JMenuItem Actionlistener

Java鼠标监听器

java - 如何在 JButton 矩阵中创建事件?

java - 在 mouseListener 中删除并添加新的 JLabel

java - 通过递归查找 Char 数组中的字符序列

java - 使用 CountDownTimer 方法暂停循环,直到方法完成

java - 如何从文件读取数据直到遇到空行

java - KeyboardFocusManager.setCurrentKeyboardFocusManager() 打破焦点