سؤال

أحاول أن أكتب استنساخ أحادي للألغام في جافا للمتعة. لدي شبكة من JButtons التي سوف تتغير ملصقاتها لتمثيل عدد الخطر والأعلام، إلخ.

مشكلتي هي أنه لا أعرف كيفية الحصول على نقرة بزر الماوس الأيمن على 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" فقط. ولكن الأهم من ذلك، هذا لا يفعل شيئا لخفض الزر.

تحرير: Macs يحتوي على مشغل منبثق يحدث على MousePress، وليس MouseClick.

تحرير: إليك الحل الذي عملته خارج الإجابة المقبولة:

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

استنساخ Minesweeper http://grab.by/1y9z.

هل كانت مفيدة؟

المحلول

لا يمكن الضغط على الزر بواسطة النقر بزر الماوس الأيمن. إضافة مثل هذه الأسطر لك المستمع الماوس

موفر:

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

mousereaded:

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

أو هل هناك مهما تريد.

نصائح أخرى

لن تستخدم isPopupTrigger ولكن تحقق مباشرة من الزر الأيمن:

Button.Addmouselistener (MouseeDapter جديد () {Public Void MouseClicked (MouseEvent E) {Mouseevent E) {منجم Boolean = field.ismine (x، y)؛ إذا كان (x، y)؛ إذا (e.getButton () == mouseVent.button2) {button.settext ("f" )؛} ...

مجرد إضافة صغيرة: أبسط طريقة للتحقق من الزر الأيمن هو SwingUtilities.isRightMouseButton

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/mouseevent.html.

MouseVent لديه بعض الخصائص

static int BUTTON1
static int BUTTON2
static int BUTTON3

من بين أمور أخرى. تحقق من أولئك عند حرائق الحدث الخاص بك.

تعديل

Public Int GetButton ()

Returns which, if any, of the mouse buttons has changed state. 

كما ذكرت أن التحقق من "MoMpressed" حل مشكلتك. و Javadoc ISPOPPRIGGER. سوف يفسر الحاجة لذلك:

Public Boolean ISPOPTRIGGER ()
...
ملاحظة: يتم تشغيل القوائم المنبثقة بشكل مختلف على أنظمة مختلفة. لذلك، يجب فحص ISPOPPRIGGER في كل من مولون مونالت ومواجي مائي للحصول على وظيفة مناسبة مناسبة مناسبة.

انظر أيضا القسم المستمع الماوس API في جاوة تأرجح الدورة التعليمية.

الزر الذي يتم الاكتئاب بشكل واضح على النقر بزر الماوس الأيمن ليس جزءا من السلوك "العادي" للأزرار. قد تكون قادرا على مزيفة استخدامها JToggleButtonS، أو ببساطة تغيير لون خلفية الزر وربما الحدود أثناء إجراء زر الماوس الأيمن.

إذا كنت متأكدا من أن الحدث يتم تشغيله بشكل صحيح (Debug FTW!) وأن الزر "settette.settexxt (" f ") يحدث، فربما تحتاج ببساطة إلى إعادة رسم.

إعادة رسم الزر.http://java.sun.com/javase/6/docs/api/javax/swing/jcomponent.html#repaint(java.awt.rectangle)

هذا يعمل بالنسبة لي بخير على ماك:

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 ولكن لا أعرف متى يتم تشغيل هذا واحد على أجهزة Macs.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top