Ir ao conteúdo
  • Cadastre-se

Java mover botão em tempo de execução


Posts recomendados

boa noite
   alguém pode me ajudar aqui ,  estou querendo fazer uma interface na linguagem java que mova um botão em tempo de execução assim que clicar no outro botão então preciso também pegar a posição X Y do mouse onde clicou para que o botão se mova até esse ponto .  tenho esse código que funciona , criado no netbeans , comecei clicando em novo projeto e escolhi java / aplicação java e desmarquei a caixa de criar classe principal, depois criei um novo arquivo clicando em java / classe java e em finalizar , mas o botão só se move um pouco a cada clicada no outro botão e eu queria que ele se movesse até o ponto onde clicou com o mouse  :
 

    /*
      criado com ( java -- aplicação java ) e desmarcado a caixa criar classe
      e criado um arquivo novo com ( java --  classe java ) .
     */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class criar_botoes_clase extends JFrame implements ActionListener
{
    JButton b1, b2 ;
    public criar_botoes_clase()          //apenas cria os objetos e só vem aqui huma vez
    {
        setTitle("Acrescentando botões");//titulo da janela
        setBounds(400,150,500,500);      //tamanho e posição da janela
    b1 = new JButton();                  //um botão 
        b1.setText("Sair");              //escrito no botao
        b1.setSize(100,25);              //tamabho e altura do botão
        b1.setLocation(x,200);           //posição do botão na janela
        b1.setBackground(Color.orange);  //cor de fundo do botão
        b1.setForeground(Color.blue);
        b1.setFont(new Font("Sans Serif",Font.BOLD,14));
        /*b1.setBorder(BorderFactory.createBevelBorder(1,Color.white,Color.black));*/
        b1.setEnabled(true);
        b1.addActionListener(this);
        b1.setMnemonic(KeyEvent.VK_S);   //igual a utilizar ALT+S
    b2 = new JButton("");                /*Cadastrar*/
        b2.setSize(100,25);
        b2.setLocation(200,100);
        b2.setFont(new Font("ScriptS",Font.ITALIC,12));
        /*b2.setBorder(BorderFactory.createLineBorder(Color.black,2));*/
        b2.setEnabled(true);
        b2.addActionListener(this);
        b2.setMnemonic(KeyEvent.VK_C);    // igual a utilizar ALT+C
        getContentPane().setLayout(null);
        getContentPane().add(b1);
        getContentPane().add(b2);
    }	
    
    public void actionPerformed(ActionEvent e)//ações de cada Botão
    {  
        x+=10;                            //toda vez que clicar em um botão ele vem aqui
        if(x > 390)x=0;
        b1.setLocation(x,200);            //posição do botão na janela
        if(e.getSource()==b1)
        {
            System.exit(0);
        }	
        if(e.getSource()==b2) 
        {
            /*JOptionPane.showMessageDialog(null, "clicou no botão 2");*/
        }	
    }	
    static int x=50,y=0;
    public static void main (String arg[])
    {   //não fica em loop aqui dentro não 
        JFrame Ex = new criar_botoes_clase();
        Ex.setVisible(true);
    }

}

 

Link para o comentário
Compartilhar em outros sites

Bom para fazer isso o botão a ser clicado deve ter um tamanho grande para quando clicar em cima dele o outro botão aparecer sobre posto. Segue o código abaixo.

import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class criar_botoes_clase extends JFrame implements ActionListener
{
    JButton b1, b2 ;
    
    public criar_botoes_clase()          //apenas cria os objetos e só vem aqui huma vez
    {
        setTitle("Acrescentando botões");//titulo da janela
        setBounds(400,150,500,500);      //tamanho e posição da janela
    b1 = new JButton();                  //um botão 
        b1.setText("Sair");              //escrito no botao
        b1.setSize(100,25);              //tamabho e altura do botão
        b1.setLocation(x,y);           //posição do botão na janela
        b1.setBackground(Color.orange);  //cor de fundo do botão
        b1.setForeground(Color.blue);      //cor da fonte
        b1.setFont(new Font("Sans Serif",Font.BOLD,14)); //configurações da fonte
        /*b1.setBorder(BorderFactory.createBevelBorder(1,Color.white,Color.black));*/
        b1.setEnabled(true);            //botão ativo
        b1.addActionListener(this);     //procura o que o botão faz
        b1.setMnemonic(KeyEvent.VK_S);   //igual a utilizar ALT+S (sair da janela)
    b2 = new JButton("");                /*Cadastrar*/
        b2.setSize(400,400);
        b2.setLocation(0,0);
        b2.setFont(new Font("ScriptS",Font.ITALIC,12));
        /*b2.setBorder(BorderFactory.createLineBorder(Color.black,2));*/
        b2.setEnabled(true);
        b2.addActionListener(this);
        b2.setMnemonic(KeyEvent.VK_C);    // igual a utilizar ALT+C
 
        
        //declara os componetes
        getContentPane().setLayout(null);
        getContentPane().add(b1);
        getContentPane().add(b2);
       
    }	
      
     

    //Pegar posição do mouse
    public void mouseposicao ()
    {
     //Captura o click
     Point p = java.awt.MouseInfo.getPointerInfo().getLocation();
     
     //repassa valores para as variaveis
     x = p.x;//passa posição para as variaveeis
     y = p.y;
     
     //chama a função para mover o botao b1
     moverb1();
    
    }
    
    
    
    
    
    //mover botão b1
    public void moverb1 ()
    {
       x = x-460;
       y = y-200;
       b1.setLocation(x,y);            //posição do botão na janela
    }
    public void actionPerformed(ActionEvent e)//ações de cada Botão
    {
        if(e.getSource()==b1)
        {
             System.exit(0);
        }
        if(e.getSource()==b2)
        {
           // moverb1 ();            
           mouseposicao();            
        }
        
    }
   
    
    static int x=0,y=0; //valor inicial da variavel x
    public static void main (String arg[])
    {   //não fica em loop aqui dentro não 
        JFrame Ex = new criar_botoes_clase();
        Ex.setVisible(true);
    }
    
      
               

}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@edifesf10 @edifesf10      obrigado ,  seu código ficou bom e funcionou bem ,   mas será que tem como fazer o botão se mover um pixel de cada vez para que ele se mova devagar e não de um lugar para o outro de uma vez ?  pois o que preciso mesmo é ver o botão se deslocando de onde ele está e indo para o ponto onde clico com o mouse , e se é possível não ter esse botão 2 e ao clicar  na janela o botão b1 se mover para lá  .    como seria a função que faz o objeto ficar se movendo .    

      agradeço desde já  .

Link para o comentário
Compartilhar em outros sites

Tem como sim eu fiz assim:

1 Criei um novo form JFrame;

2 Adicionei uma JLabel e renomeei para lb1 - tamanho 300 por 300;

3 Adicionei um JButton e renomeei para b1;

4 Criei uma função - public void mouseposicao ;

 public void mouseposicao ()
    {
        int x = 0, y = 0;
     Point p = java.awt.MouseInfo.getPointerInfo().getLocation();//Captura o click
      x = p.x;//passa posição para as variaveeis
     y = p.y;//passa posição para as variaveeis
    } 

5 No evento MouseEntered da JLabel criei o codigo abaixo;

private void lb1MouseEntered(java.awt.event.MouseEvent evt) {                                 
        b1.setLocation(evt.getX(),evt.getY());
         int z[] = {};//Array para redirecionar de acordo com o movimento
         int x = z[0];//Repassa o valor para y
         int y = z[1]; //Repassa o valor para y
         mouseposicao(); //chama função que faz a movimentação de b1
    }                       

6 fiz o import da biblioteca

import java.awt.Point;

Aqui funcionou perfeitamente, abraços Edifesf

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@edifesf10    muito obrigado pela ajuda , valeu mesmo  !    ainda estou no começo dos estudos  desse java e com seu código deu pra entender melhor como construir códigos ,  mas não sei no que errei pois o botão está pulando do local onde está para o ponto onde clico com o mouse ,   e não estou vendo o botão ir deslizando vagarosamente de onde ele está até o ponto clicado no Jlabel , creio que precisa de uma função que fique sendo executada o tempo todo e dentro dessa função irá mover o botão lentamente até o ponto clicado ,  por favor dê uma olhada no código que fiz e veja no que errei .   fiz como você explicou , criei um novo projeto e desmarquei a caixa de criar classe java  depois criei um novo projeto com um JFrame e nele coloquei um jlabel e um botão e usei esse código aqui  :

package meu.botaoSaltitante;

import java.awt.Point;
public class HumJFrame extends javax.swing.JFrame {
    public HumJFrame() {
        initComponents();
    }
    public void mouseposicao () {
        int x = 0, y = 0;
        Point p = java.awt.MouseInfo.getPointerInfo().getLocation();//Captura o click
        x = p.x;              //passa posição para as variaveeis
        y = p.y;              //passa posição para as variaveeis
    }
    @SuppressWarnings("unchecked")
    private void lb1MouseClicked(java.awt.event.MouseEvent evt) {                                 
        b1.setLocation(evt.getX(),evt.getY());
         int z[] = {};       //Array para redirecionar de acordo com o movimento
         int x = z[0];       //Repassa o valor para y
         int y = z[1];       //Repassa o valor para y
         mouseposicao();     //chama função que faz a movimentação de b1
    }                                
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new HumJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton b1;
    private javax.swing.JLabel lb1;
    // End of variables declaration                   
}

 

Link para o comentário
Compartilhar em outros sites

Eu acho que o seu erro está na inicialização dos componentes da uma olhada acima desta linha - "private void lb1MouseClicked(java.awt.event.MouseEvent evt) {"

 

veja se a função - private void initComponents() { está declara e se está de acordo com o código abaixo:

 


    private void initComponents() {

        lb1 = new javax.swing.JLabel();
        b1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        lb1.setText("lb1");
        lb1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                lb1MouseEntered(evt);
            }
        });

        b1.setText("b1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(lb1, javax.swing.GroupLayout.PREFERRED_SIZE, 361, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(b1)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(lb1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addGap(31, 31, 31)
                .addComponent(b1)
                .addContainerGap(244, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        
   

Se não estiver declarada então copie o código acima e insira no seu código acima da linha - "private void lb1MouseClicked(java.awt.event.MouseEvent evt) {   "

 

Abraços Edifesf10

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

@edifesf10        obrigado pela ajuda , com sua dica consegui fazer funcionar ,    no netbeans  comecei criando um novo projeto java / applicação java e desmarquei a caixa de criar classe principal ,   depois criei um novo arquivo e escolhi forms GUI Swing e form Jframe  coloquei o nome e finalizar  e depois coloquei um jpanel e um Jbutton e cliquei no Jbutton com o botão direito do mouse e modifiquei o nome da variável para b1 , e coloquei esse código e modifiquei o nome da classe e pacote para que fique igual ao que eu coloquei , então o código ficou assim  :

package pac.timer_3;

import javax.swing.Timer;
import javax.swing.JButton;  
import javax.swing.JFrame;  
import java.awt.AWTException;  
import java.awt.Robot;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.awt.event.InputEvent;  
public class classe_timer_3 extends javax.swing.JFrame {

    public classe_timer_3() {
        initComponents();
        objTimer = new Timer(((100)), taskPerformer);
        objTimer.setRepeats(true); 
        objTimer.start();
    }

    @SuppressWarnings("unchecked")
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        b1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        b1.setText("botão");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(b1)
                .addContainerGap(329, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(195, Short.MAX_VALUE)
                .addComponent(b1)
                .addGap(100, 100, 100))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>                        
    ActionListener taskPerformer = new ActionListener() 
    {
        public void actionPerformed(ActionEvent evt) 
        {
            b1.setLocation(x,y);
            x += 10;
            if(x == 100)
                y = 80;
            else
                if(x == 200)
                    y = 50;
                else
                    if(x == 350){
                        objTimer.stop();
                        x = 0;
                }
        }
    };
    static int x,y=100;
    Timer objTimer;
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(classe_timer_3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(classe_timer_3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(classe_timer_3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(classe_timer_3.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new classe_timer_3().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton b1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                   
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...