java中的交换值

java中的交换值,java,swing,user-interface,jbutton,Java,Swing,User Interface,Jbutton,所以基本上我正在学习一些基本的java,我现在正在写一个小“游戏”,告诉你点击哪个按钮,如果你点击了正确的一个,你会得到一分。按钮定义为b1、b2、b3和b4。上面的文字写着“按钮1”、“按钮2”、“按钮3”和“按钮4” 我希望做到的是,每次单击按钮时,都会随机重新分配值,以便b1文本(例如)可能会显示“按钮3”。但这是随机的。我使用Java random让它按照我想要的方式工作,但现在我需要解决让按钮被分配相同值的问题。例如,b1和b3可能都被命名为“按钮2”。我不知道如何着手解决这个问题,任

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

我希望做到的是,每次单击按钮时,都会随机重新分配值,以便b1文本(例如)可能会显示“按钮3”。但这是随机的。我使用Java random让它按照我想要的方式工作,但现在我需要解决让按钮被分配相同值的问题。例如,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.");    

}
}

编辑:布莱恩使用洗牌的方式更好;忘记那个方法了,哈哈。我的错。忽略此答案并使用它。

使用
“按钮1”、“按钮2”、“按钮3”、“按钮4”创建字符串的ArrayList

每次单击按钮时,创建一个ArrayList,它是上述数组的副本(而不是引用的副本)。例如:
arraylistcopy=newarraylist(intialArrayList)

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

例如:

intj=3;
ArrayList copy=新建ArrayList(初始ArrayList);
对于(int i=0;i<3;i++){
//int rand=在i和j之间生成随机数
String text=copy.get(rand);
//各b1、b2、b3、b4的setText(文本);
//复制。删除(文本);
j--;
}
为此创建一个单独的方法,这样您就不必为每个
actionPerformed
方法一直键入此内容


我就是这么做的

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

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

列表中声明按钮文本

List<String> myList = 
    new ArrayList<String>(Arrays.asList("text1", "text2", "text3", "text4"));

当然请编辑并向我们显示您的代码。请将您的代码张贴在您将值分配给按钮的位置。否则,这不是最好的方式<正如Brian提到的,代码>洗牌(Shuffle)
更快、更干净。正如我所说,我对编程相对较陌生。你可能可以从我发布的代码中看出。我不太清楚如何使用ArrayList,所以也许你可以在你发布的示例旁边发布一些伪代码?最好使用一个集合并不断填充,直到你得到所需数量的数字…但这个想法是正确的;)它可以用来赋值,但不是随机赋值,是吗?恐怕我不明白你的意思。这正是你所要求的。谢谢,它确实起作用了,我的错。遇到了另一个问题。我是这个网站的新手,有没有一种方法可以像在论坛上一样表示感谢?@Chawbee接受我的答案-左边的复选标记(你还没有足够的代表投票支持它)。谢谢我接受了,但我需要15个代表来代表你:\但我真的很感激!
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));