1

JPanels とマウス リスナーを使用して小さなカラー セレクターを作成しましたが、何らかの理由で結果が期待どおりに反応せず、その理由がわかりません。

カスタムカラーセレクター

そのために、ColorPanel と呼ばれる変更された 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

    }

}

}

これは、必要なすべてのパネルとそのカウンターをインスタンス化するために作成した別のオブジェクト、および選択したカラーパネルの境界線の色を変更し、その色をグローバル変数に保存するメソッドにリンクされています。

機能している間は、カラーパネルを選択するために何度かクリックする必要がありました。プログラムには以前は応答性の問題はなく、そのセレクターだけがこのように動作していました。

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



}

これが方法です。作成時にすべてのパネルがベクターに追加されるため、簡単に操作できます。

4

1 に答える 1

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 から離れない限り、クリックが登録されます。

于 2015-09-08T07:39:12.310 に答える