Как перетасовать позиции кнопок при наведении мыши? - PullRequest
0 голосов
/ 07 декабря 2018

Мне было интересно, сможет ли кто-нибудь помочь, потому что я искал в Интернете все выше и ниже и даже спросил одного из своих наставников, и они тоже не могли этого выяснить.

По сути, это то, что нужно сделать:При инициализации приложение должно случайным образом выбрать, где найти кнопку «Нажмите меня».Когда мышь перемещается над кнопкой «щелкнуть меня», она должна переместиться в случайное положение (перетасовать кнопки), чтобы пользователь всегда преследовал кнопку «щелкнуть мной» и никогда не смог ее щелкнуть.

Мне удалось получитькнопки для перестановки мест при инициализации, поместив кнопки в массив и добавив массив на панель, затем перетасовывая кнопки, но я не могу заставить их сделать это снова, когда мышь находится над кнопкой «щелкни меня».

Вот код:

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 голосов
/ 07 декабря 2018

Для простоты давайте создадим функцию 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();

}

Я надеюсь, что это работает)

PS Иногда вы можете столкнуться с тем, что кнопка не перетасовывается, это потому, что перетасовка даст тот же «индекс» для«Нажми меня», поэтому его позиция не изменится (хотя другие изменятся)

0 голосов
/ 07 декабря 2018

Вы можете сделать это легко с помощью только одной кнопки и абсолютного позиционирования.

Идея состоит в том, чтобы просто вычислить новое случайное местоположение, которое все еще находится в границах контейнера.

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