在java中切换值

时间:2013-12-23 04:44:41

标签: java swing user-interface jbutton

所以基本上我正在学习一些基本的java,我现在正在写一个小“游戏”,告诉你点击哪个按钮,如果你点击正确的那个,你会得到一个点。按钮定义为b1,b2,b3和b4。它们上面的文字说“按钮1”,“按钮2”,“按钮3”和“按钮4”。

我希望实现的是每次单击按钮时,都会随机重新分配值,以便例如b1文本可能会显示“按钮3”。但它会是随机的。我使用Java随机来实现我想要的工作,但现在我需要解决按钮被赋予相同值的问题。例如,b1和b3可能都被命名为“按钮2”。我不确定如何解决这个问题,任何帮助将不胜感激。这让我很沮丧。

好的,所以这是我的代码.....终于。有一个可怕的互联网连接atm。

我在需要帮助的地方发表评论

import javax.swing.*;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Gui extends JFrame implements ActionListener {


private JButton b1 = new JButton("Button 1");
private JButton b2 = new JButton("Button 2");
private JButton b3 = new JButton("Button 3");
private JButton b4 = new JButton("Button 4");
private static JLabel label = new JLabel();
private static JLabel label2 = new JLabel("You currently have 0 points.");
private JPanel p = new JPanel(new GridBagLayout());
private int points = 0;
private int randomButton;


public Gui() {
    super("Button Game");
    newLabel();
    setSize(400, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);

    b1.addActionListener(this);
    b2.addActionListener(this);
    b3.addActionListener(this);
    b4.addActionListener(this);


    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(10,10,10,10);
    c.gridx = 2;
    c.gridy = 1;
    p.add(b1,c);
    c.gridx = 1;
    c.gridy = 2;
    p.add(b2, c);
    c.gridx = 3;
    c.gridy = 2;
    p.add(b3, c);
    c.gridx = 2;
    c.gridy = 3;
    p.add(b4, c);
    c.gridx = 2;
    c.gridy = 2;
    p.add(label, c);
    c.gridx = 2;
    c.gridy = 4;
    p.add(label2, c);

    add(p);

}


public void rearrangeButtons() {

    //HERE IS WHERE I AM HAVING THE PROBLEM
    //b1.setText("Button " + randomButton);
    //b2.setText(newText);
    //b3.setText(newText);
    //b4.setText(newText);
}

public static int random(int range) {
    return (int)(java.lang.Math.random() * (range+1));
}


public static void newLabel() {
    switch(random(3)) {
    case 0:
        label.setText("Press button 1");
        break;
    case 1:
        label.setText("Press button 2");
        break;
    case 2:
        label.setText("Press button 3");
        break;
    case 3:
        label.setText("Press button 4");
        break;
    }
}


@Override
public void actionPerformed(ActionEvent e) {
    String number = label.getText();



    if (e.getSource() == b1) {
        if (number.endsWith("1")) {
        points++;
        newLabel();
        } else {
            points = 0;
        }
    }
    if (e.getSource() == b2) {
        if (number.endsWith("2")) {
        points++;
        newLabel();
        } else {
            points = 0;
        }
    }
    if (e.getSource() == b3) {
        if (number.endsWith("3")) {
        points++;
        newLabel();
        } else {
            points = 0;
        }
    }
    if (e.getSource() == b4) {
        if (number.endsWith("4")) {
        points++;
        newLabel();
        } else {
            points = 0;
            newLabel();
        }
    }

    rearrangeButtons();
    label2.setText("You currently have " + points + " points.");    

}
}

3 个答案:

答案 0 :(得分:2)

Collections为您提供了一种简单的方法:

List

中声明您的按钮文字
List<String> myList = 
    new ArrayList<String>(Arrays.asList("text1", "text2", "text3", "text4"));

每次要更改按钮上的文本时,随机播放列表并指定:

Collections.shuffle(myList);
b1.setText(myList.get(0));
b2.setText(myList.get(1));
b3.setText(myList.get(2));
b4.setText(myList.get(3));

答案 1 :(得分:1)

编辑:Brian使用Shuffle的方式更好;忘了那个方法,哈哈。我的错。忽略这个答案并使用它。

使用"button 1", "button 2", "button 3", "button 4"

创建字符串的ArrayList

每次单击一个按钮时,创建一个ArrayList,它是上述数组的副本(不是引用的副本)。例如:ArrayList<String> copy = new ArrayList<String>(intialArrayList);

然后使用JButton#setText和Math.Random()为第一个按钮选择其中一个字符串。 每次选择字符串时,都要从副本中删除字符串。(这样就无法设置按钮文本两次)。 然后重复其余按钮,但要确保生成的随机数首先在0-3之间,然后是0-2,然后是0-1。

例如:

int j = 3;
ArrayList<String> copy = new ArrayList<String>(initialArrayList);
for(int i = 0; i< 3; i++) {
    //int rand = generate random number between i and j
    String text = copy.get(rand);
   // setText(text) for each b1, b2, b3, b4;
   // copy.remove(text);
   j--;
}

为此创建一个单独的方法,这样您就不必为每个actionPerformed方法输入此内容。

这就是我如何做到的。

答案 2 :(得分:0)

也许每次要重置按钮文本时,都会构建4个文本“按钮1”,“按钮2”,“按钮3”,“按钮4”的列表。随机选择一个,将其分配给b1,然后将其从列表中删除,现在只剩下3个可用文本。从剩余的3列表中再次随机选择并将其分配给b2。继续,直到您的可用文本列表为空(或在这种情况下为4次)。当您需要再次重置这些文本时,只需将可用文本列表重置为“按钮1”,“按钮2”,“按钮3”,“按钮4”并重复。