1

つまり、Netbeansに20個の数学方程式のラベルを保持するJFrameがあります。

mathLabel1は「2+2」です

mathLabel2は「4*4」です

等...

そして、mathLabel1が表示され、ユーザーが正しい答え(4)を推測した場合、その要素を配列から削除したいsetVisible(false)ので、再び質問として表示されることはありません。

基本的に、繰り返しはありません。

これが私のコードの短いバージョンです:

//declare variables
String strUserAnswer;
int i;
Random r = new Random();
int randvalue = r.nextInt(19);
JLabel[] math = {mathLabel1, mathLabel2, mathLabel3, mathLabel4, mathLabel5, mathLabel6, mathLabel7, mathLabel8, mathLabel9, mathLabel10, 
    mathLabel11, mathLabel12, mathLabel13, mathLabel14, mathLabel15, mathLabel16, mathLabel17, mathLabel18, mathLabel19, mathLabel20}; 
JLabel test;    

//method that chooses random math equation
public void random(JLabel test) {
    r = new Random();
    randvalue = r.nextInt(19);
    test = math[randvalue];

    if (test == math[0]) {
        mathLabel1.setVisible(true);
    }
    else if (test == math[1]){
        mathLabel2.setVisible (true);
    }
    else if (test == math[2]){
        mathLabel3.setVisible (true);
    }
    else if (test == math[3]){
        mathLabel4.setVisible (true);
    }
    else if (test == math[4]){
        mathLabel5.setVisible (true);
    }
    else if (test == math[5]){
        mathLabel6.setVisible (true);
    }
    else if (test == math[6]){
        mathLabel7.setVisible (true);
    }
    else if (test == math[7]){
        mathLabel8.setVisible (true);
    }
    else if (test == math[8]){
        mathLabel9.setVisible (true);
    }
    else if (test == math[9]){
        mathLabel10.setVisible (true);
    }
    else if (test == math[10]){
        mathLabel11.setVisible (true);
    }
    else if (test == math[11]){
        mathLabel12.setVisible (true);
    }
    else if (test == math[12]){
        mathLabel13.setVisible (true);
    }
    else if (test == math[13]){
        mathLabel14.setVisible (true);
    }
    else if (test == math[14]){
        mathLabel15.setVisible (true);
    }
    else if (test == math[15]){
        mathLabel16.setVisible (true);
    }
    else if (test == math[16]){
        mathLabel17.setVisible (true);
    }
    else if (test == math[17]){
        mathLabel18.setVisible (true);
    }
    else if (test == math[18]){
        mathLabel19.setVisible (true);
    }
    else if (test == math[19]){
        mathLabel20.setVisible (true);
}
}                                          

private void guessButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // User clicks guess to enter answer, if correct part of puzzle appears

    strUserAnswer = answerText.getText();
    test = math[randvalue];

    //if the math equation chosen is 2+2...
    if (test == math[0]) {

        //show math equation
        mathLabel1.setVisible(true);

        //if answer is right...
        if (strUserAnswer.equals("4")) {
            JOptionPane.showMessageDialog(null, "Yay!! That is right!");
            //show puzzle piece, hide equation, and choose a new one
            label1.setVisible(true);
            mathLabel1.setVisible(false);
            //test.remove(math[0]);
            test = math[randvalue];
            answerText.setText(null);
            random(test);

        //if answer is wrong...
        } else {
            JOptionPane.showMessageDialog(null, " Sorry, try again!");
            answerText.setRequestFocusEnabled(true);
        }
    }

そして、それは、、、などのためmath[1]に繰り返されます。math[2]math[3]

では、これをどのように行うのでしょうか?remove()メソッドを試しましたが、それは暗闇の中でのショットでした...

4

2 に答える 2

2

さて、これはあなたの一日を作ったり、あなたの心を壊したりするかもしれませんが、あなたはあなたのrandom()メソッドで必要以上のことをしています。まず、パラメータを使用する前に手動で値を変更しているように見えるため、パラメータを取り込む必要はないようです。また、配列内の各値は実際にはJLabelであるため、ifステートメント全体を調べる代わりに、math [randValue] .setVisible(true)と言うことができます。ものを削除するという問題を解決するために、私が紹介するようにすばやく汚い方法がありますが、配列の代わりにArrayListを使用することをお勧めします。

public void random() {
  Random r = new Random();
  randValue = r.nextInt(math.length);  //make sure the index is always within the array
  JLabel[] temp = new JLabel[math.length - 1];  //this will do the trick
  math[randValue].setVisible(true);
  for (int i = 0; i < randvalue; i++) {
    temp[i] = math[i];  //fill the new array up to the chosen label
  }
  for (int i = randValue; i < temp.length; i++) {
    temp[i] = math[i + 1];  //fill the rest, omitting the chosen label
  }
  math = new JLabel[temp.length];  //math is now shorter
  math = temp;  //put everything back in the original array
}  

これは、アレイを使用したソリューションとして機能するはずです。それが役に立てば幸い。

于 2012-12-08T00:15:47.607 に答える
1

データ構造が絶えず変化する場合は、配列の代わりにリストを使用してみてください。

List<JLabel> labels = new ArrayList<JLabel>();
int numLabels = 20;
for (int i = 0; i < numLabels; i++) {
    labels.add(new JLabel(i + " " + i));
}

そこからいつでも電話をかけることができます:

labels.get(4).setVisible(false);

また

labels.remove(4);

そして、JPanelを再検証します。

編集2:

私はあなたの質問を誤解したかもしれません-あなたは番号を削除して、そのラベルを二度と作成したくないようです。これはそれを行う正しい方法です:

int numIntegers = 20;
Set<Integer> possibleNumbers = new HashSet<Integer>();
for (int i = 0; i < numIntegers; i++) {
    possibleNumbers.add(i);
}

アイテムを削除する場合は、次を使用します。

possibleNumbers.remove(14);

次に、このデータを表示する場合は、次を使用できます。

panel.clear();
for (Integer number : possibleNumbers) {
    panel.add(new JLabel(number + "  " + number));
}

(JLabelsデータの呼び出しが間違っていたことに注意してください。これらはプレゼンテーションの一部です。)

于 2012-12-07T23:30:45.823 に答える