الطريقة الصحيحة لانتظار السلاسل لتصبح متساوية

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

  •  22-07-2019
  •  | 
  •  

سؤال

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

while (!correctAnswer.equals(currentAnswer)) {
         // wait for user to click the button with the correct answer typed into the textfield
}
// and then continue

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

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

المحلول

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

في هذه الحالة الحل سهل جدا: إضافة المستمع الحدث (ActionListener) إلى زر الإرسال وتحقق النتيجة هناك. إذا به OK، على المضي قدما. إذا لم يكن كذلك، أقول ذلك والسماح لهم حاول مرة أخرى.

نصائح أخرى

كما اقترح الآخرون، ستحتاج إلى استخدام تعيين مستمع للزر، والذي سيتم استدعاؤه عند الضغط على الزر.

فيما يلي مثال غير كامل يوضح كيفية استخدام ActionListener وتنفيذها actionPerformed الطريقة التي يتم استدعاؤها عند الضغط على الزر:

...
final JTextField textField = new JTextField();
final JButton okButton = new JButton("OK");
okButton.addActionListner(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        if ("some text".equals(textField.getText()))
            System.out.println("Yes, text matches.");
        else
            System.out.println("No, text does not match.");
    }
});
...

قد ترغب فقط في التنفيذ ActionListener في الفصل حيث يوجد الزر وحقل النص، لذلك لا تحتاج إلى الإعلان عن الكائنين final.(لقد استخدمت للتو فئة داخلية مجهولة لإبقاء المثال قصيرًا.)

لمزيد من المعلومات، قد ترغب في إلقاء نظرة على كيفية كتابة مستمع العمل من دروس جافا.

أيضًا، للحصول على معلومات عامة حول كيفية عمل الأحداث في Java، يمكن العثور على درس:كتابة مستمعي الأحداث من دروس جافا قد تكون مفيدة.

يحرر: تغير التعبير في الداخل if بيان من textField.getText().equals("some text") ل "some text".equals(textField.getText()) من أجل منع أ NullPointerException لو textField كان null, ، بناء على اقتراح من السيد.تعليق لامع وجديد.

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

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

وآمل أن يكون هذا الأمر يبدو معقولا تماما ...؛ -)

نعم، كما قال الجميع هنا.

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

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

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

وهذا الرمز ليس له قيمة أخرى من المعرض في كامل <م> على استعداد لتشغيل عينة كيف يتم تطبيق هذا المفهوم.

واجهة المستخدم الرسومية بسيطة http://img229.imageshack.us/img229/1532/simplenz0 بابوا نيو غينيا

// * used for brevity. Preffer single class per import
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;


public class MatchString{

    private final JTextField password;
    private final JFrame frame;

    public static void main( String [] args ){
        MatchString.show();
    }

    public static void show(){
        SwingUtilities.invokeLater( new Runnable(){
            public void run(){
                new MatchString();
            }
        });
    }

    private MatchString(){
        password = new JPasswordField( 20 );
        frame = new JFrame("Go to www.stackoverflow");
        init();
        frame.pack();
        frame.setVisible( true );
    }


    private void init(){

        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        frame.add( new JPanel(){{
            add( new JLabel("Password:"));
            add( password );
        }});

        // This is the key of this question.
        // the password textfield is added an 
        // action listener
        // When the user press enter, the method 
        // validatePassword() is invoked.
        password.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ) {
                validatePassword();
            }
        });
    }


    private void validatePassword(){            
        // If the two strings match
        // then continue with the flow
        // in this case, open SO site.    
        if ( "stackoverflow".equals(password.getText())) try {
            Desktop.getDesktop().browse( new URI("http://stackoverflow.com"));
            frame.dispose();
        } catch ( IOException ioe ){
            showError( ioe.getMessage() );
        } catch ( URISyntaxException use ){
            showError( use.getMessage() );
        } else {
            // If didn't match.. clear the text.
            password.setText("");
        }
    }
 }

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

في هذه الحالة بالذات، حيث كنت في حاجة للقيام الاشياء للحصول على مدخلات الاختبار، أود أن أقترح استخدام حلقة do-while.

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