كيف يمكنني استخدام المستمعين للوصول إلى عناصر أخرى؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا إنشاء واجهة المستخدم الرسومية حيث كنت بحاجة إلى أن تأخذ المعلومات المدخلة من عناصر النموذج ومعالجة المعلومات. وهذا يتطلب مني أن استخدام بعض العناصر للوصول إلى الآخرين.

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

وهذا هو ما يبدو قانون بلدي مثل الآن (لقد جزءا لا يتجزأ من أسئلتي في التعليقات):

public class MyClass
{
    public static void main(String args[])
    {
        // Form elements are in here
        JTextField myTextField = new JTextField(10);
        JButton myTextFieldSubmit = new JButton("Submit");
        myTextFieldSubmit.addActionListener(new ListenerClass());
    }
}

class ListenerClass implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // This is what happens when these elements are used
        // I need to be able to access the form elements from MyClass in here, but this doesn't seem possible with my current setup
        // For example, when the Submit button is pressed, I need to be able to myTextField.getText() and edit MyClass members
        // How should my setup be changed to accommodate these needs?
    }
}

وشكرا على اي مساعدة!

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

المحلول

وهذا هو إلى حد كبير مسألة نطاق متغير.

وحاليا، فإن حقل نص وزر هم في نطاق طريقة main، وبالتالي فإن وجود فئة منفصلة للActionListener يعني أنه لن يكون الوصول إلى هذه المتغيرات.

وهناك عدد قليل من الطرق لتحقيق ذلك:

و(1) تقديم ListenerClass الطبقة الداخلية في MyClass، وتحويل myTextField وmyTextFieldSubmit في حقول مثيل MyClass.

public class MyClass
{
  final static JTextField myTextField = new JTextField(10);
  final static JButton myTextFieldSubmit = new JButton("Submit");

  public static void main(String args[])
  {
    myTextFieldSubmit.addActionListener(new ListenerClass());
  }

  static class ListenerClass implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      myTextField.setText("");
    }
  }
}

و(2) تقديم الطبقة الداخلية من مجهولين في طريقة main، وهذا سوف يسمح myTextField وmyTextFieldSubmit البقاء في نفس المكان، طالما يتم الإعلان عنها final.

public class MyClass
{
  public static void main(String args[])
  {
    final JTextField myTextField = new JTextField(10);
    final JButton myTextFieldSubmit = new JButton("Submit");

    myTextFieldSubmit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
            myTextField.setText("");
        }
    });
  }
}

و(3) جعل فئة المحلية التي المحلي إلى طريقة main. مرة أخرى، وهذا سوف يتطلب حقل النص والزر ليعلن final للسماح بالوصول من الطبقة الداخلية.

public class MyClass
{
  public static void main(String args[])
  {
    final JTextField myTextField = new JTextField(10);
    final JButton myTextFieldSubmit = new JButton("Submit");

    class ListenerClass implements ActionListener
    {
      public void actionPerformed(ActionEvent e)
      {
        myTextField.setText("");
      }
    }

    myTextFieldSubmit.addActionListener(new ListenerClass());
  }
}

و(4) تسليم إشارة إلى ListenerClass، على سبيل المثال في منشئ، وأيضا جعل myTextField وmyTextFieldSubmit متغير مثيل.

public class MyClass
{
  JTextField myTextField = new JTextField(10);
  JButton myTextFieldSubmit = new JButton("Submit");

  public MyClass()
  {
    myTextFieldSubmit.addActionListener(new ListenerClass(this));
  }

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

class ListenerClass implements ActionListener
{
  MyClass myClass;

  public ListenerClass(MyClass myClass)
  {
    this.myClass = myClass;
  }

  public void actionPerformed(ActionEvent e)
  {
    myClass.myTextField.setText("");
  }
}

و(5) تقديم myTextField وmyTextFieldSubmit في حقول static، وإتاحة الوصول المباشر من ListerClass.

public class MyClass
{
  static JTextField myTextField = new JTextField(10);
  static JButton myTextFieldSubmit = new JButton("Submit");

  public static void main(String args[])
  {
    myTextFieldSubmit.addActionListener(new ListenerClass());
  }
}

class ListenerClass implements ActionListener
{
  public void actionPerformed(ActionEvent e)
  {
    MyClass.myTextField.setText("");
  }
}

لا يزال هناك على الارجح المزيد من الطرق لتحقيق ذلك، وربما تكون هناك طرق أفضل لتنفيذ ذلك. اختيار النهج الذي تأخذ تعتمد حقا على تصميم المرجوة من تطبيق.

نصائح أخرى

ويمكنك تمرير في اشارة الى MyClass في المنشئ لListenerClass.

والمشكلة هي مشتركة لاستخدام المستمعين لأي غرض في جاوة: كيفية السماح الوصول معالج الكائن الذي يخطر المستمعين أو أقرانه

وعموما هناك اتفاقيتين.

واحد هو الحصول على الكائن مباشرة من كائن الحدث. هل يمكن أن تفعل هذا مع getSource (). ولكن بعد ذلك كنت فقط الحصول على القطعة التي فعلت ذلك.

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

ولكن، في هذه الحالة الحاجيات الخاصة بك هي المتغيرات، وليس أعضاء (هل أنت متأكد أنك تريد أن تفعل ذلك؟). لذلك الحل الوحيد سيكون لدينا أعضاء يحوزون عليها في فئة Listner، ومن ثم بدلا من خلق المستمع في الدعوة addListener، إنشاء المستمع، لتمرير الحاجيات ذات الصلة، وإضافة المستمع. يمكن للمستمع الآن الوصول إلى تلك الحاجيات من خلال إشاراته الخاصة بهم التي يتم تخزينها في الأعضاء.

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