鼠标放在按钮上时如何调整按钮位置?

How to shuffle button positions when mouse is on it?

我想知道是否有人可以提供帮助,因为我在互联网上到处搜索,甚至问过我的一位导师,他们也不知道。

基本上这是需要做的:在初始化时,应用程序应该随机选择 "Click Me" 按钮的位置。当鼠标移到“点我”按钮上时,它应该移动到一个随机位置(打乱按钮),这样用户就会永远追逐“点我”按钮,永远无法点击它。

我设法让按钮在初始化时随机排列位置,方法是将按钮放在数组列表中,然后将数组列表添加到面板,然后随机排列按钮,但是当鼠标悬停在'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();
  }

 }

任何帮助将不胜感激。

只需一个按钮和绝对定位即可轻松做到这一点。

这个想法只是计算一个仍在容器边界内的新随机位置。

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);
    }
}

为简单起见,让我们创建函数 '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" 相同的 'index',所以它的位置不会改变(其他人会改变)