鼠标放在按钮上时如何调整按钮位置?
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',所以它的位置不会改变(其他人会改变)
我想知道是否有人可以提供帮助,因为我在互联网上到处搜索,甚至问过我的一位导师,他们也不知道。
基本上这是需要做的:在初始化时,应用程序应该随机选择 "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',所以它的位置不会改变(其他人会改变)