بنية البرمجة Java Swing: هل من المفترض أن يكون المستمعون مصدرًا لجميع مكونات التأرجح تقريبًا؟

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

سؤال

سؤالي يتلخص في هذا: هل هو بنية قياسية في البرمجة البرجية لمنح المستمعين التحكم في مكونات جديدة (مثل JPanel جديدة) للعرض والإدخال ، ولإعطاء مستمعي المكون الجديد تحكم في مكونات جديدة للعرض والإدخال ، وهكذا إلى اللانهاية؟ أو هل تحتاج Java إلى العودة إلى نوع من الصفوف الموحدة التي تربط جميع مكونات التأرجح معًا بترتيب إجرائي؟

في الوقت الحاضر ، في طلبي الذي يستخدم JFrame واحد فقط ، في مستمعي ، يتم تمرير كائن JFrame الأولي الخاص بي كمعلمة لجميع JPanels الخاصة بي حتى يتمكن مستمعونهم من الاتصال بإزالة () لمسح الإطار للحصول على JPanel جديد. على سبيل المثال ، رمز قصير على النحو التالي

public class MainFrame {
  JFrame jfrm;
  public MainFrame() {
    jfrm = new JFrame("Main Frame");
    JPanel mainPanel = new MainPanel(jfrm);
  }
}

public class MainPanel extends JPanel {
  public MainPanel(final JFrame mainFrame) {
    JButton example = new JButton("Example");
    example.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent le) {
            mainFrame.removeall();
            JPanel 2ndPanel = new 2ndPanel(mainFrame);
            mainFrame.add(2ndPanel);
            mainFrame.validate();
        }
    });
  }
}

هل هذا هو الهيكل الصحيح - حيث يكون المستمعون الذين يولدون اللوحات الجديدة وليس بعض الفئة الموحدة؟ ولكن إذا كان هذا هو الحال ، فكيف يصل برنامج التحويل البرمجي لجافا إلى Mainframe.validate () إذا كان هناك ما لا نهاية للمستمعين؟ أنا مبرمج إجرائي للمدرسة القديمة يحاول برمجة تطبيق التأرجح في Java ، وأعتقد أنني ربما لم أكن أدرك المفاهيم الأساسية لبرمجة التأرجح. نتطلع إلى أي إجابات مفيدة ، وشكرا مقدما!

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

المحلول

لن أفعل ذلك هكذا. ال نمط المراقب يستخدم في التأرجح لإرسال الإخطارات ، عادة نتيجة لإجراء المستخدم.

خذ مثالك: "ينقر" المستخدم على الزر لأنه يريد لوحة جديدة في Mainframe. لكن الزر لا يعرف ماذا يفعل بنقرة. كل ما يمكنه فعله هو إخطار مستمعي الحدث, ، أنه تم اختياره.

لذلك نحن بحاجة إلى بعض المكونات المهتمة بالإخطارات. يمكن لهذا المكون تسجيل مستمع مع الزر وتلقي الإخطارات. المستمع هو هذه المكونات الأخرى "أذن" (أو "العين"). لكن الأذن (أو العين) لن تتخذ إجراء. إنه مجرد مستشعر المكونات الأخرى.

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

لكن الراتب هو مكان سيء لهذا الرمز.

نصائح أخرى

بدلاً من تدمير وإنشاء لوحات قد ترغب في النظر إلى إخفاءها/عرضها. هناك مدير تخطيط cardlayout يمكنه القيام بذلك: http://journals.ecs.soton.ac.uk/java/tutorial/ui/layout/card.html

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

كما قال الآخرين ، قد ترغب في إضافة نوع من النماذج إلى التصميم الخاص بك ، وهو المسؤول عن الحفاظ على حالة النظام.

بادئ ذي بدء ، يجب ألا تدع المستمع يعالج الإطار مباشرة ، استخدم متداخلًا JPanel أو هو ContentPane.

يعتمد سؤالك على مكان وجود مستمعك. يجب عليك فقط إضافة مكونات إلى JFrame من الفصل نفسه. في حالتك ، لا بأس ، لأن المنطق يقتصر على الفصل نفسه.

لا أعتقد أن هناك ما لا نهاية للمستمعين. هم في قائمة ويتم تنفيذها بالتتابع. يجب أن يستخدم المستمع الخاص بك SwingUtilities.invokeLater لمعالجة الإطار الرئيسي.

أجد وفاة JFrame كحجة زائدة قليلاً. لماذا لا تنشئ المستمع من خارج المنشئ؟

 final JPanel mainPanel = new MainPanel();     
 JButton example = new JButton("Example");
 example.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent le) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               MainFrame.this.removeAll();
               MainFrame.this.add(mainPanel);
            }
         });;
    }
 });
 add(example);

إنها ليست أفضل الأمثلة ، لكنني أتأكد من ما تحاول القيام به.

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

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

نادراً ما يكون من المنطقي تعيين مكونات للحقول في الفصل الذي يخلقها. في الواقع ، افعل أقل في البنائين.

تفعل أيضا أقل في فصول داخلية مجهولة. قم بفك بيانات الحدث واستدعاء طريقة منطقية بالنسبة لفصل المرفق كعملية.

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