当鼠标在其上时,如何调整按钮位置?

时间:2018-12-07 12:41:16

标签: java user-interface button mouse

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

基本上,这是需要做的:初始化时,应用程序应随机选择“ 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();
  }

 }

任何帮助将不胜感激。

2 个答案:

答案 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”提供相同的“索引”,因此其位置不会改变(其他人会改变)