18

私は楽しみのためにJavaでマインスイーパクローンを書こうとしています。危険カウントやフラグなどを表すためにラベルを変更するJButtonのグリッドがあります。

私の問題は、JButtonを右クリックしてボタンを押す方法がわからないことです。私は次のことをしました:

button.addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e){
        boolean mine = field.isMine(x, y);
        if (e.isPopupTrigger()) {
            button.setText("F");
        }
        else {
            if (mine) {
                button.setText("X");
            }
        }
    }
});

これはまったく機能していないようです。「F」は表示されず、「X」の部分のみが表示されます。しかし、もっと重要なことは、これはボタンを押すために何もしません。

編集:Macでは、mouseClickではなくmousePressでポップアップトリガーが発生します。

編集:これが私が受け入れられた答えに基づいて解決した解決策です:

button.addMouseListener(new MouseAdapter(){
            boolean pressed;

            @Override
            public void mousePressed(MouseEvent e) {
                button.getModel().setArmed(true);
                button.getModel().setPressed(true);
                pressed = true;
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                //if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));
                button.getModel().setArmed(false);
                button.getModel().setPressed(false);

                if (pressed) {
                    if (SwingUtilities.isRightMouseButton(e)) {
                        button.setText("F");
                    }
                    else {
                        button.setText("X");
                    }
                }
                pressed = false;

            }

            @Override
            public void mouseExited(MouseEvent e) {
                pressed = false;
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                pressed = true;
            }                    
        });
        add(button);

マインスイーパークローンhttp://grab.by/1y9z

4

8 に答える 8

5

私は使用しませんisPopupTriggerが、右のボタンを直接確認します:

button.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent e){
    boolean mine = field.isMine(x, y);
    if (e.getButton() == MouseEvent.BUTTON2) {
      button.setText("F");
    }
  ...
于 2010-01-05T13:21:25.057 に答える
5

右クリックでボタンが押せません。そのような行をマウスリスナーに追加します

マウスが押された:

if(isRightButtonPressed) {underlyingButton.getModel().setPressed(true));

マウスのリリース:

if(needReset) {underlyingButton.getModel().setPressed(false));

またはそこでやりたいことは何でもします。

于 2010-01-05T14:42:00.323 に答える
2

ちょっとした追加:正しいボタンをチェックする最も簡単な方法はSwingUtilities.isRightMouseButton

于 2010-01-05T22:05:30.670 に答える
1

MouseEventにはいくつかのプロパティがあります

static int BUTTON1
static int BUTTON2
static int BUTTON3

とりわけ。イベントが発生したときにそれらを確認してください。

編集

public int getButton()

Returns which, if any, of the mouse buttons has changed state. 
于 2010-01-05T13:17:51.990 に答える
1

「mousePressed」をチェックすると問題が解決したと述べたように。そしてisPopupTriggerの Javadoc は、これの必要性を説明します:

public boolean isPopupTrigger()
...
注: ポップアップ メニューは、システムによって異なる方法でトリガーされます。したがって、適切なクロスプラットフォーム機能を実現するには、mousePressed と mouseReleased の両方で isPopupTrigger をチェックする必要があります。

Java SwingチュートリアルのThe Mouse Listener APIに関するセクションも参照してください。

于 2010-01-05T13:32:16.560 に答える
0

右クリックでボタンが目に見えて押されていることは、ボタンの「通常の」動作の一部ではありません。JToggleButtonsを使用するか、マウスの右ボタンを押したままボタンの背景色と境界線を変更するだけで、偽造できる場合があります。

于 2010-01-05T13:20:11.643 に答える
0

イベントが適切にトリガーされ (デバッグ FTW!)、button.setText("F") が発生していることが確実な場合は、単純に再描画する必要があります。

ボタンを塗り直します。 http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

于 2010-01-05T13:23:41.813 に答える
0

これはMacでうまく機能します:

import java.awt.event.*;
import javax.swing.*;

public class ButtonTest extends JFrame {

    JButton button;

    public ButtonTest() {
        button = new JButton("W");
        button.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == 3) { // if right click
                    button.setText("F");
                    button.getModel().setPressed(false);
                    // button.setEnabled(true);
                } else {
                    button.setText("X");
                    button.getModel().setPressed(true);
                    // button.setEnabled(false);
                }
            }
        });
        this.add(button);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new ButtonTest();
    }

}

e.getButton() == 2 を確認することもできますが、これが Mac でいつトリガーされるかはわかりません。

于 2010-01-05T14:08:53.147 に答える