سؤال

لدي بعض الأسئلة لهذا البرنامج، أول شيء أحاول القيام به هو جعله قادرًا على المقارنة ومعرفة ما إذا كان حقل النص يساوي موضع colorValues[x].المشكلة الثانية هي عبارة if التي تقول if inText == إلى colorValues.length - 1 لفتح مربع يشير إلى التهاني التي لا تعمل أيضًا.الإصدار الثالث حتى لو حصل على رسالة آسف و/أو رسالة تهانينا كيف تفعل ذلك بحيث لا يظهر الحقل النصي؟

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;

  public class AlbertCardonaProg7 extends JFrame
 {
  private static final int WIDTH = 350;
  private static final int HEIGHT = 250;
  private static final String[] colorValues = {"red","white",
 "yellow","green","blue"};// I dentifies the colors 
  private JTextField nameBox;
  private JLabel greeting;
  private String[] message  = {"Input color number 1",
 "Input color number 2: ","Input color number 3: "
  ,"Input color number 4:","Input color number 5:"};
  private   JLabel namePrompt = new JLabel(this.message[0]);

   public AlbertCardonaProg7()
   {
   setTitle("MEMORY GAME"); 
   setSize(WIDTH, HEIGHT);
   setLayout(new FlowLayout(FlowLayout.CENTER));
   setDefaultCloseOperation(EXIT_ON_CLOSE);
   createContents();
   setVisible(true);
   }// end constructor
  //******************************************
 private void createContents()
 {
  nameBox = new JTextField(15);
  greeting = new JLabel();
  add(namePrompt);
  add(nameBox);
  add(greeting);
  nameBox.addActionListener(new Listener());
  }//end createContents

 //************************************************
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
  int inText;
  for(inText =0; inText <  5; inText++)
   {
       if(nameBox.getText().equals(colorValues[inText] ))
    {
     namePrompt.setText( message[inText]); // its not working trying 
        //to see if it is equal to the proper spot 
        //in the colorValues[array]

         add(nameBox);
         nameBox.setText("");
         nameBox.requestFocus();
         inText++;
       }

         if(!nameBox.getText().equals(colorValues[inText]))
          {
             AlbertCardonaProg7 darn = new AlbertCardonaProg7();
             darn.namePrompt.setText("Sorry, drink more Ginseng ");

             add(namePrompt);
             break;
          }

        if( inText == (colorValues.length -1))
         {
      AlbertCardonaProg7 darn = new AlbertCardonaProg7();
      darn.namePrompt.setText("Congradulations,
            Your mind is Awesome!!!");

           add(namePrompt);
           break;
        }

      }// loop
     }//end action performed
    }// end class Listener

  //**************************************
   public static void main(String[] args)
   {
      String colors = "";
      for(int i = 0; i < colorValues.length; i++)
       colors += colorValues[i] + "  ";
      JOptionPane.showMessageDialog(null,"How good is your memory.\n
      See if you can memorize this sequence.\n\n" + colors,
      "Message", JOptionPane.INFORMATION_MESSAGE );

        AlbertCardonaProg7 outBox = new AlbertCardonaProg7();

       }// end main class
      }//end Class AlberCardonaProg7
هل كانت مفيدة؟

المحلول

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

ثانيًا، يحتوي الكود الذي قمت بنشره على أخطاء نحوية في السطرين 64 و80 مما يتسبب في فشل عملية التجميع.تكمن المشكلة في أن Java لا تسمح لك بالحصول على سلاسل حرفية متعددة الأسطر داخل الكود المصدري، لذلك يتعين عليك ربط السلسلتين معًا.على سبيل المثال:

darn.namePrompt.setText("Congradulations,
   Your mind is Awesome!!!");

يجب ان يكون:

darn.namePrompt.setText("Congradulations," + 
    " Your mind is Awesome!!!");

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

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

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

وبجمع كل ذلك معًا تحصل على هذا:

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class AlbertCardonaProg7 extends JFrame {
    private static final int WIDTH = 350;
    private static final int HEIGHT = 250;
    private static final String[] colorValues = { "red", "white", "yellow",
        "green", "blue" };

    private final JLabel[] inputLabels = new JLabel[colorValues.length];
    private final JTextField[] inputFields = new JTextField[colorValues.length];
    private int index = 0;

    public AlbertCardonaProg7() {
        //Create the UI controls
        for (int i = 0; i < colorValues.length; i++) {
            inputLabels[i] = new JLabel("Input color number " + i + ":");
            inputLabels[i].setVisible(false);
            inputFields[i] = new JTextField(15);
            inputFields[i].setVisible(false);
            inputFields[i].addActionListener(new Listener());

            add(inputLabels[i]);
            add(inputFields[i]);
        }

        //Make the first set visible
        inputLabels[0].setVisible(true);
        inputFields[0].setVisible(true);

        setTitle("MEMORY GAME");
        setSize(WIDTH, HEIGHT);
        setLayout(new FlowLayout(FlowLayout.CENTER));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private class Listener implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            if (inputFields[index].getText().equals(colorValues[index])) {
                JOptionPane.showMessageDialog(null, "Congratulations, you got the answer correct");

                //See if there are more controls to make visible
                if (++index < colorValues.length) {
                    inputLabels[index].setVisible(true);
                    inputFields[index].setVisible(true);
                }
            } else {
                JOptionPane.showMessageDialog(null,
                        "Sorry, your answer is wrong", "Error",
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    public static void main(String[] args) {
        String colors = "";
        for (int i = 0; i < colorValues.length; i++) {
            colors += colorValues[i] + "  ";
        }

        JOptionPane.showMessageDialog(null, "How good is your memory.\n"
                + "See if you can memorize this sequence.\n\n" + colors,
                "Message", JOptionPane.INFORMATION_MESSAGE);

        AlbertCardonaProg7 outBox = new AlbertCardonaProg7();

    }
}

يحرر: بناءً على تعليقك أدناه، قمت بتعديل البرنامج ليتوافق مع السلوك المتوقع.التغييرات الرئيسية هي أن المُنشئ لم يعد يخفي عناصر التحكم الأخرى، ويجب على المستمع الآن تكرار كل حقل إدخال للتأكد من صحتها جميعًا:

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class AlbertCardonaProg7 extends JFrame {
    private static final int WIDTH = 350;
    private static final int HEIGHT = 250;
    private static final String[] colorValues = { "red", "white", "yellow",
        "green", "blue" };

    private final JLabel[] inputLabels = new JLabel[colorValues.length];
    private final JTextField[] inputFields = new JTextField[colorValues.length];

    public AlbertCardonaProg7() {
        //Create the UI controls
        for (int i = 0; i < colorValues.length; i++) {
            inputLabels[i] = new JLabel("Input color number " + i + ":");
            inputFields[i] = new JTextField(15);
            inputFields[i].addActionListener(new Listener());

            add(inputLabels[i]);
            add(inputFields[i]);
        }

        setTitle("MEMORY GAME");
        setSize(WIDTH, HEIGHT);
        setLayout(new FlowLayout(FlowLayout.CENTER));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private class Listener implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            // See if there are any wrong answers
            boolean correct = true;
            for(int i = 0; i < colorValues.length; i++) {
                if (!inputFields[i].getText().equals(colorValues[i])) {
                    correct = false;
                }
            }

            if(correct) {
                JOptionPane.showMessageDialog(null, 
                        "Congratulations, you got the answer correct");
            } else {
                JOptionPane.showMessageDialog(null,
                        "Sorry, your answer is wrong", "Error",
                        JOptionPane.ERROR_MESSAGE);

            }
        }
    }

    public static void main(String[] args) {
        String colors = "";
        for (int i = 0; i < colorValues.length; i++) {
            colors += colorValues[i] + "  ";
        }

        JOptionPane.showMessageDialog(null, "How good is your memory.\n"
                + "See if you can memorize this sequence.\n\n" + colors,
                "Message", JOptionPane.INFORMATION_MESSAGE);

        AlbertCardonaProg7 outBox = new AlbertCardonaProg7();

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