Java JLabel数组在使用后删除元素

时间:2012-12-07 23:23:29

标签: java arrays netbeans jlabel

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

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()方法,但这是在黑暗中拍摄的......

2 个答案:

答案 0 :(得分:2)

好的,所以这可能会让你的一天或你心碎,但你的方法比使用random()方法更多。首先,看起来你不需要参加一个参数 因为看起来您在使用它之前手动更改了值。另外,因为数组中的每个值实际上都是JLabel,所以你可以说math [randValue] .setVisible(true)而不是遍历整个if语句。并且为了解决你移除东西的问题,我会告诉你一个快速而肮脏的方法,但你最好使用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
}  

这应该作为使用数组的解决方案。 希望它有所帮助。

答案 1 :(得分: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数据是错误的 - 它们是演示文稿的一部分。)