Botão de desbloqueamento estilo o do iPod

3 respostas
mamangava

Boa tarde galera, já pesquisei um tanto sobre isso e estou com alguns problemas para fazer o que quero.
Meu problema é o seguinte, eu preciso criar um botão estilo o do iPod quando esta “bloqueado”, que você clica em cima dele e arrasta para desbloquear.
Tenho um código onde consigo fazer algumas coisas, tipo arrastá-lo, porém não consigo fazer com que o botão volte gradativamente para o local de início e também
não consigo travá-lo para que ele vá até um ponto da tela, por exemplo, eu quero que o botão vá até a metade da tela e depois não vá mais pra frente, porém pra trás ele pode ir.

Segue abaixo o código que estou usando, peguei em um tópico aqui do fórum e fiz algumas modificações.

import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class NewMain extends JFrame {

    private static final long serialVersionUID = 1L;
    private JButton botao;
    private int x;
    private int y;
    private JPanel pTeste;
    private int xos;

    public NewMain() {
        super();
        setTitle("Drag & Drop Demo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        botao = new JButton("Arraste-me!");
        botao.setBounds(50, 50, 150, 30);
        botao.addMouseMotionListener(new Controler());
        botao.addMouseListener(new MListener());

        pTeste = new JPanel();
        pTeste.setBounds(0, 0, 500, 500);
        pTeste.add(botao);

        this.getContentPane().add(pTeste);
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    private class Controler extends MouseMotionAdapter {

        @Override
        public void mouseDragged(MouseEvent e) {
            if (verificaTela(e)) {
                botao.setLocation(botao.getX() + (e.getX() - x), botao.getY());
            }
        }

        public boolean verificaTela(MouseEvent e) {
            if (botao.getBounds().getMaxX() >= getWidth()) {
                xos = e.getXOnScreen();
                if (e.getXOnScreen() - xos < 0) {
                    System.out.println("botao.getX() " + botao.getX());
//                System.out.println("e.getX() " + e.getX());
                    System.out.println("e.getX(2) " + e.getXOnScreen());
                } else {
                    System.out.println(e.getXOnScreen());
                    System.out.println(xos);
                }
            }
            if (botao.getX() + botao.getWidth() < getWidth() && botao.getBounds().getMinX() > 0) {
                return true;
            }
            return false;
        }
    }

    private class MListener extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            x = e.getX();
            y = e.getY();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (botao.getX() > 50) {
                for (int i = botao.getX(); i > 50; i--) {
                    botao.setLocation(i, 50);
                }
            } else {
                for (int i = botao.getX(); i < 50; i++) {
                    botao.setLocation(i, 50);
                }
            }
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewMain();
            }
        });
    }
}

Então é isso galera.

Atenciosamente,

Rafael.

3 Respostas

InicianteJavaHenriqu

Só ideais, não sei se vai funcionar, de imediato:

Para voltar o botão gradativamente ao ponto de origem armazene em duas variáveis x e y, por exemplo, os pontos de origem, em seguida faça que uma estrutura de repetição decremente os valores de x e y até retornar ao ponto de origem e vai alterando a localização do botão com estas variáveis.

Para travar o botão em um ponto da tela remova o Drag & Drop depois de usa-lo a 1º vez.

flw :thumbup:

mamangava

Então, em relação a voltar o botão para a posição inicial eu ja tinha feito isso que você me sugeriu, porém, quando na estrutura de repetição eu coloco o componente para ir voltano para a posição ele não aparece na tela voltando. A tela não é redesenhada, o componente simplesmente volta para a posição inicial direto.

E em relação a trava-lo em um ponto da tela, eu acho que me expressei mal. Eu preciso para que quando o componente chegue ao final da tela, ele não passe dos limites. Por exemplo, a minha tela tem 500x500, eu preciso que a parta mais a esquerda do componente não passe do ponto 0 da minha tela e a parte mais a direita não passe do ponto 499.

Mas mesmo assim vlws pelo comentario.

InicianteJavaHenriqu

coloque um sleep e repaint a cada loop.

if(x&lt;2||x&gt;498){
     //trava
}

É + ou - por ai.

Criado 27 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 3
Participantes 2