2015-09-08 51 views
1

我用JPanels和鼠标监听器做了一个小小的颜色选择器,但由于某种原因,结果不如预期那样响应,我不知道为什么。缺乏响应能力的Java鼠标监听器

custom color selector

为了做到这一点我创建了一个修改的JPanel我叫颜色面板,将它添加一些属性,如颜色和颜色的名字,建于鼠标侦听器实例化时,定义背景色等:

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 

    } 

} 

}

这也与我做意味着实例化我需要的所有小组及其countainer,以及更改所选colorpanels边框颜色和存储其我coulour方法的另一个对象nto全局变量。

虽然它有效,但每隔几次我都要点击几次来选择一个颜色面板。该程序之前没有响应性问题,选择器是唯一表现这种方式的事情。

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



} 

这是一种方法,创建时所有面板都添加到矢量中,所以我可以轻松操纵它们。

+1

考虑提供一个[可运行的示例](https://stackoverflow.com/help/mcve),它演示了您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这会导致更少的混淆和更好的响应 – MadProgrammer

+0

'repaint()'在哪里? – RealSkeptic

+0

没有,我没有添加一个,因为一切正常显示。 –

回答

3

只有在按下并释放鼠标之间没有移动鼠标时,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就会注册一个点击。

+0

谢谢,这固定了它。我不会猜到这是问题所在。 –