2015-09-08 103 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

謝謝,這固定了它。我不會猜到這是問題所在。 –