我想知道是否有人可以提供帮助,因为我在互联网上搜索了很多东西,甚至问了我的一位导师,他们也都找不到。
基本上,这是需要做的:初始化时,应用程序应随机选择“ Click Me”按钮的位置。当鼠标移到“单击我”按钮上时,它应移动到随机位置(将按钮随机排列),因此用户将永远追逐“单击我”按钮,并且永远无法单击它。
我设法通过将按钮放入数组列表中并将该数组列表添加到面板中,然后对按钮进行混洗来使按钮在初始化时随机播放,但是当鼠标悬停在“单击”上时,我无法让它们再次执行该操作我”按钮。
代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.EmptyBorder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.*;
public class Chase extends JFrame implements MouseListener {
JButton plain1, plain2, plain3, plain4, plain5, plain6, plain7, plain8, click;
ArrayList<JButton> buttons;
JPanel panelButtons;
public Chase(){
JPanel panel = new JPanel(new BorderLayout(5, 5));
panel.setBorder(new EmptyBorder(4, 4, 4, 4));
setTitle("Catch me if you can!");
setContentPane(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panelButtons = new JPanel(new GridLayout(3, 3, 4, 4));
buttons = new ArrayList<JButton>();
plain1 = new JButton();
plain2 = new JButton();
plain3 = new JButton();
plain4 = new JButton();
plain5 = new JButton();
plain6 = new JButton();
plain7 = new JButton();
plain8 = new JButton();
click = new JButton("Click Me");
buttons.add(plain1);
buttons.add(plain2);
buttons.add(plain3);
buttons.add(plain4);
buttons.add(plain5);
buttons.add(plain6);
buttons.add(plain7);
buttons.add(plain8);
buttons.add(click);
Collections.shuffle(buttons);
for(JButton jb:buttons){
panelButtons.add(jb);
}
panel.add(panelButtons, BorderLayout.CENTER);
pack();
setSize(500, 300);
setVisible(true);
click.addMouseListener(this);
}
public void mouseEntered(MouseEvent event){
//this is what I need to figure out.
Collections.shuffle(buttons);
}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public static void main(String[] args) {
Chase chase = new Chase();
}
}
任何帮助将不胜感激。
答案 0 :(得分:0)
只需一个按钮和绝对的位置,您就可以轻松地做到这一点。
这个想法只是要计算一个仍然位于容器边界内的新随机位置。
class ClickMe extends JPanel {
JButton button = new JButton();
ClickMe() {
setLayout(null);
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
ThreadLocalRandom rand = ThreadLocalRandom.current();
// Change location within the bondaries of the button container
button.setLocation(
rand.nextInt(0, ClickMe.this.getWidth()),
rand.nextInt(0, ClickMe.this.getHeight())
);
}
});
button.setBounds(10, 10, 120, 60);
add(button);
}
}
答案 1 :(得分:0)
为简单起见,让我们创建函数'initPanel()'并将您的代码放在此处(当然在构造函数中调用它):
public void initPanel() {
Collections.shuffle(buttons);
for(JButton jb:buttons){
panelButtons.add(jb);
}
panel.add(panelButtons, BorderLayout.CENTER);
pack();
setSize(500, 300);
setVisible(true);
}
然后,您需要做的就是清除当前面板,然后在鼠标悬停在按钮上时再次对其进行初始化:
public void mouseEntered(MouseEvent event){
//this is what I need to figure out.
panel.removeAll();
initPanel();
}
我希望这能奏效
P.S。有时,您可能会遇到按钮没有改组的情况,这是因为改组将为“ Click me”提供相同的“索引”,因此其位置不会改变(其他人会改变)