جافا:باستخدام actionlistener إلى استدعاء دالة في فئة أخرى على كائن من تلك الفئة

StackOverflow https://stackoverflow.com/questions/1346978

سؤال

أساسا ما أريد القيام به هو الحصول على زر ابدأ لبدء طريقة تشغيل في فئة أخرى والعمل على كائن آخر.

بلدي رمز المستمع:

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

بلدي رمز فئة أخرى:

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

و

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

أشعر أن هذا لا يمكن أن يكون من الصعب جدا, ولكن أنا في عداد المفقودين قطعة.

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

المحلول

ويستخدم طريقة واحدة للأشياء الإشارة في فئة مجهولة الكلمة final:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

وبدلا من ذلك، يمكنك الوصول إلى أعضاء (المتغيرات أو طرق) من نوع أرفق:

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}

نصائح أخرى

ولقد كان لي نفس المشكلة مثلك وهذا هو كيف يمكنني حلها.

ويمكنك جعل إما نهائي وجوه الخاص بك (CastleCrash سيم النهائي = CastleCrash جديدة ()؛)، ولكن لم أكن أريد أن تفعل ذلك، أو يمكنك ان تجعل ما يشبه أسلوب اضع لتشغيل الأسلوب في الطبقة الأخرى الخاصة بك:

وبلدي التعليمات البرمجية للفئة المستمع:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

وبلدي رمز للفئة أخرى:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

وهذا الأمل هو مفيد، حظا سعيدا! :)

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

وبطريقة ما تحتاج إشارة إلى كائن CastleCrash الخاصة بك متاحة لدعوة من actionListener الخاص بك.

وربما كنت ترغب في فئة فرعية JFrame، أو كل ما تحتوي بك JButton بحيث على حد سواء الأسلوب الرئيسي الخاص بك وخاصية CastleCrash التي يمكن بعد ذلك المشار إليه من صفك الداخلية مجهولة Actionlistener.

ولكن - كن حذرا، أنت تبدو وكأنك تدعو ماذا سيكون طريقة تشغيلها لفترة طويلة من داخل موضوع الحدث واجهة المستخدم الرسومية (حيث دعا المستمع العمل). هذا بشكل عام فكرة سيئة، وسوف لحالة واجهة المستخدم الرسومية الخاصة بك لتصبح لا تستجيب.

http://java.sun.com/ المنتجات / JFC / TSC / المواد / المواضيع / threads1.html خصوصا قليلا على الطبقة SwingWorker للأفكار حول كيفية تجنب هذه المشكلة.

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