1

所以我在 Netbeans 中有一个 JFrame,它包含 20 个数学方程式标签。

mathLabel1是“2 + 2”

mathLabel2是“4 * 4”

ETC...

如果显示了 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,所以你可以只说 math[randValue].setVisible(true) 而不是遍历整个 if 语句。为了解决你删除东西的问题,有一种快速而肮脏的方法可以做到,我将向你展示,但你最好使用 ArrayList 而不是 Array。

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 而不是 Array:

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 回答