Desplazamiento de JButton o JLabel

Iniciado por c0der, 19 Diciembre 2010, 17:40 PM

0 Miembros y 1 Visitante están viendo este tema.

c0der

Que tal usuarios del elhacker, bueno mi duda es la siguiente, que funcion de java permide el desplazamiendo atraves del cursor de un jbutton en la pantalla de un jframe. Les coloco una imagen de lo que pretendo hacer, lo cual seria desplazar un boton por la lineas punteadas que se ven en la imagen solamente dando click al cursor del raton sin soltarlo y moviendlo a la derecha e izquierda, pero que no salga de esas lineas punteadas:


Si alguien sabe como hacerlo, me ayudaria mucho si me podria proporcionar un ejemplo, saludos y gracias de antemano.

1mpuls0

#1
Hola que tal.

Mira aquí tienes un ejemplo de apoyo (que ya es mucho).

Código (java) [Seleccionar]

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class MovingButton extends JComponent implements ActionListener {


private Timer timer;                        // para iniciar/detener las acciones
    private int animationDuration = 2000;   // cada animación tomará 2 segundos
    private long animStartTime;     // tiempo de inicio de cada animación
    private int translateY = 0;                 // ubicación actual del boton en Y
    private static final int MAX_Y = 100;
    private JButton button = null;

    /**
*
*/
private static final long serialVersionUID = 1L;

public static void main(String args[]) {
        Runnable doCreateAndShowGUI = new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        };
        SwingUtilities.invokeLater(doCreateAndShowGUI);
    }
   
    private static void createAndShowGUI() {
        JFrame f = new JFrame("Moviendo un Boton");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 300);
        JComponent buttonContainer = new MovingButton();
        f.add(buttonContainer);
        f.setVisible(true);
        f.setLocationRelativeTo(null);
    }
   
    /**
     * Pinta nuestro contenedor con un fondo de tablero de ajedrez.
     * Se crea un objeto graphics, se llama a la superclase, que va
     * a pintar a nuestro boton.
     */
    public void paint(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        // traslada nuestros graficos en funcion del valor de traslateY
        g.translate(0, translateY);
        super.paint(g);
    }

   
    /** crear una nueva instancia de TranslucentButton */
    public MovingButton() {
        setLayout(new java.awt.FlowLayout());
        timer = new Timer(30, this);
        button = new JButton("Iniciar");
        button.setOpaque(false);
        button.addActionListener(this);
        add(button);
    }
   
    /**
     * Este metodo controla los clics que inician y detienen la animación
     */
    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource().equals(button)) {
            // clic sobre el botón
            if (!timer.isRunning()) {
                animStartTime = System.nanoTime() / 1000000;
                button.setText("Deterner");
                timer.start();
            } else {
                timer.stop();
                button.setText("Iniciar");
                // coloca la traslación en 0
                translateY = 0;
                // Pinta de nuevo para obtener la posición final borrada
                repaint();
            }
        } else {
            // temporizador de eventos
            // calcular la fracción transcurrida
            long currentTime = System.nanoTime() / 1000000;
            long totalTime = currentTime - animStartTime;
            if (totalTime > animationDuration) {
                animStartTime = currentTime;
            }
            float fraction = (float)totalTime / animationDuration;
            fraction = Math.min(1.0f, fraction);
            // este calculo se hace para pasar translateY de 0 MAX_Y
            // la fraccion va de 0 a 1
             if (fraction < .5f) {
                translateY = (int)(MAX_Y * (2 * fraction));
            } else {
                translateY = (int)(MAX_Y * (2 * (1 - fraction)));
            }
            // pinta el boton en la nueva ubicación.
            repaint();
        }
    }
}


Saludos.
abc

c0der

No te vallas a ofender amigo agredesco mucho tu respuesta pero ese codigo lo hago en 2 patadas, creo que me falto aclarar que lo importante (que es lo que quiero) que el rapaint se haga cuando hago el movimiento del cursor se te agredece de todas maneras.

1mpuls0

Cita de: c0der en 20 Diciembre 2010, 06:42 AM
No te vallas a ofender amigo agredesco mucho tu respuesta pero ese codigo lo hago en 2 patadas, creo que me falto aclarar que lo importante (que es lo que quiero) que el rapaint se haga cuando hago el movimiento del cursor se te agredece de todas maneras.

No te vayas a ofender, PERO AQUI NO SE HACEN TAREAS!.

Como bien menciono, es un ejemplo. Solo te estaba mostrando las bases.
Si es como dices que lo  haces en 2 patadas(Ya quisiera verlo), solo tienes que cambiar el tipo de evento y alguna que otra cosa más.

Saludos.
abc

c0der

#4
1.- No es tarea es conocimiento autodidacta
2.- Yo Reconozco cuando no se, pero lo que tu "HICISTE" jaja lo se hacer como lo dije en 2 patadas
3.- Si hubiera querido ese codigo que repito "HICISTE" jaja me hubiera dirigido a donde lo tomaste:

http://www.java2s.com/Code/Java/Advanced-Graphics/MovingButtonContainer.htm

colocandole en la sima

/*
*Autor: Soy un mediocre copio codigos de otras webs asi digo que no ando preguntando como hacer mis propias cosas y digo que los elabore xD Darhius
*/


y solo tradusco las strings
4.- Yo no dije postea un programa completo solo la funcion con la que se hace y ya las encontre por cierto en la misma pagina de donde EL AUTOR DARHIUS hizo su codigo jaja, solo tenias que poner el link de referencia y LISTO!!! jaja :

 public void mousePressed(MouseEvent e) {
   preX = rect.x - e.getX();
   preY = rect.y - e.getY();

   if (rect.contains(e.getX(), e.getY()))
     updateLocation(e);
   else {
     ShapeMover.label.setText("Drag it.");
     pressOut = true;
   }
 }

 public void mouseDragged(MouseEvent e) {
   if (!pressOut)
     updateLocation(e);
   else
     ShapeMover.label.setText("Drag it.");
 }

 public void mouseReleased(MouseEvent e) {
   if (rect.contains(e.getX(), e.getY()))
     updateLocation(e);
   else {
     ShapeMover.label.setText("Drag it.");
     pressOut = false;
   }
 }

UN SALUDO Y SIGUE ASI AMIGO COPIA CODIGOS Y DI QUE SON TUYOS LLEGARAS MUY LEJOS XDDDDDDD

1mpuls0

#5
1. Me disculpo por colocarme como autor de ese código. Tengo muchos programas en mi pc que no recuerdo cuales hice y cuales tomé de alguna web.
2. Debiste colocar la duda que tenias sobre lo que tienes avanzado.
3. Coloca tú códito entre entiquetas de GeSHI
4. Definición de autodidacta: http://es.wikipedia.org/wiki/Autodidacta
5. Y ese código que has puesto ¿?, no entiendo. http://www.java2s.com/Code/Java/Event/MoveShapewithmouse.htm
6. Nunca dije que hubiera creado ese código  :¬¬
Entonces bien, creo qe intentas hacer algo como esto.
http://www.4shared.com/file/ylTrPMVJ/Tabla.html

Un saludo.
abc

c0der

Buena aplicacion para algo a de servir, pero no es lo que busco, ya encontre lo que buscaba y te lo mostre, creo que especifique claramente que lo avia bajado de la misma parte donde tu avias tomado el codigo xD pero bueno, hay personas lentas que se le va a hacer. un saludo y creo que este tema esta cerrado.

Debci

#7
Cita de: c0der en 20 Diciembre 2010, 20:56 PM
Buena aplicacion para algo a de servir, pero no es lo que busco, ya encontre lo que buscaba y te lo mostre, creo que especifique claramente que lo avia bajado de la misma parte donde tu avias tomado el codigo xD pero bueno, hay personas lentas que se le va a hacer. un saludo y creo que este tema esta cerrado.
Me parece como mínimo despectivo tu comentario, pues lo unico que ha hecho ha sido citar un codigo.
Ofensivo por insultar, aunque dirás que no lo has hecho a queriendas, que solo ha sido una forma de hablar y tal...
Y fatal porque has incumplido una norma, clara común en todo el foro:
NO SE HACEN TAREAS!

Además de demostrar tu vanidosidad despreciando ayudas y desconsiderandolas e infravalorando el esfuerzo (voluntario y altruista por cierto) que te ha ofrecido un compañero.

Quizás deberias enseñarnos tu a responder a tus propias preguntas inflingiendo las normas no?

A pesar de eso ha sido mas persona que tu y aún así ha querido ayudarte.

Saludos