سؤال

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

JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        openButtonPressed();
    }           
});
هل كانت مفيدة؟

المحلول

تحتاج إلى الحد من اقتران بين هذه الكائنات.

يمكنك الحصول على درجة الماجستير الكائن الذي يملك كل حقول النص و الزر ( لوحات ليست ذات صلة )

ثم separete actionlistener داخل هذا سيد الكائن ( أنا أسميها الوسيط انظر الوسيط نمط )

أن العمل المستمع ينفذ الأسلوب على الوسيط والتي بدورها تأخذ القيم من textfields وخلق ربما نقل الكائن.

بهذه الطريقة يمكنك تقليل اقتران بين الفريقين ، textfields.... الخوالسماح التحكم في مكان واحد ( الوسيط ) وهذا هو ، لا يعرفوا بعضهم البعض.

يمكنك أن تأخذ نظرة على التعليمات البرمجية في هذا السؤال:https://stackoverflow.com/questions/324554/#324559

فإنه يدل على هذه المفاهيم في تشغيل التعليمات البرمجية.

راجع للشغل المراقب نمط نفذت بالفعل في JTextField, JButton, ActionListener.... الختحتاج فقط إلى إضافة السنانير.

آمل أن يساعد هذا.

تحرير انضم اثنين من الإجابات إلى أحد.

هذا هو رمز.

class App { // this is the mediator

    // GUI components.
    private JFrame frame;
    private JTextField name;
    private JTextField count;
    private JTextField date;
    // Result is displayed here.
    private JTextArea textArea;

    // Fired by this button.
    private JButton   go;

    private ActionListener actionListener;


    public App(){
        actionListener = new ActionListener(){
            public void actionPerformed( ActionEvent e ){
                okButtonPressed();
            }
        };
    }

    private void okButtonPressed(){
         // template is an object irrelevant to this code.
         template.setData( getData() );
         textArea.setText( template.getTransformedData() );
    }


    public void initialize(){

        frame     = new JFrame("Code challenge v0.1");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        name     = new JTextField();
        count    = new JTextField();
        date     = new JTextField();
        textArea = new JTextArea();
        go       = new JButton("Go");
        go.addActionListener( actionListener ); // prepare the button.

        layoutComponents(); // a lot of panels are created here. Irrelevant.
    }
}

كاملة و تشغيل التعليمات البرمجية يمكن استرجاعها هنا:

المهم لصالح تكوين أكثر من الميراث عندما يكون ذلك ممكنا.

نصائح أخرى

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

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

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

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

أخيرا باني سوف ثم العودة الوالد الفريق مع منطق كاملة.

مرة كنت قد حصلت على لوحة الأم انها حقا فوضى الحصول على الطفل المكونات و يكون لهم فعل أي شيء.

شكراأضفت عثر طبقة الذي يعالج بطريقة أو بأخرى التواصل بين الألواح.

كما أنني وجدت هذا الرابط على المستمعين على JTextField مفيدة:

وصلة النص

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