Como tornar esse programa orientado a objeto

2 respostas
java
J

package jogohanoi;

import java.awt.Point;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;
import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

public class JogoHanoi extends JFrame {

boolean mousePressionado =  false;
boolean mousePressionado2 = false;
boolean mousePressionado3 = false;

ImageIcon iconBackground = new ImageIcon(getClass().getResource("background.jpg"));
ImageIcon iconPeça1 = new ImageIcon(getClass().getResource("peça1.jpg"));
ImageIcon iconPeça2 = new ImageIcon(getClass().getResource("peça2.jpg"));
ImageIcon iconPeça3 = new ImageIcon(getClass().getResource("peça3.jpg"));

JLabel lBackground = new JLabel(iconBackground);
JLabel lPeça1 = new JLabel(iconPeça1);
JLabel lPeça2 = new JLabel(iconPeça2);
JLabel lPeça3 = new JLabel(iconPeça3);

int posPeça1X = 85;
int posPeça1Y = 162;

int posPeça2X = 61;
int posPeça2Y = 195;

int posPeça3X = 44;
int posPeça3Y = 228;

public JogoHanoi() {
	editarJanela();
	editarComponentes();
	new Mover().start();
}

public void editarComponentes(){
	lBackground.setBounds(0, 0, 600, 300);
	lPeça1.setBounds(posPeça1X , posPeça1Y, 65, 33);
	lPeça2.setBounds(posPeça2X , posPeça2Y, 115, 33);
	lPeça3.setBounds(posPeça3X , posPeça3Y, 147, 33);
}

public void editarJanela() {
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setSize(700, 400);
	setLocationRelativeTo(null);
	setVisible(true);
	setLayout(null);
	add(lPeça1);
	lPeça1.addMouseListener(new MouseListener(){
		public void mouseClicked(MouseEvent arg0) {
		}
		public void mousePressed(MouseEvent arg0) {
			mousePressionado = true;
		}

		public void mouseReleased(MouseEvent arg0) {
			mousePressionado = false;
		}
		public void mouseEntered(MouseEvent e) {
		}
		public void mouseExited(MouseEvent e) {
		}
		
	});
	add(lPeça2);
	lPeça2.addMouseListener(new MouseListener(){
		public void mouseClicked(MouseEvent arg0) {
		}
		public void mousePressed(MouseEvent arg0) {
			mousePressionado2 = true;
		}

		public void mouseReleased(MouseEvent arg0) {
			mousePressionado2 = false;
		}
		public void mouseEntered(MouseEvent e) {
		}
		public void mouseExited(MouseEvent e) {
		}
		
	});
	add(lPeça3);
	lPeça3.addMouseListener(new MouseListener(){
		public void mouseClicked(MouseEvent arg0) {
		}
		public void mousePressed(MouseEvent arg0) {
			mousePressionado3 = true;
		}

		public void mouseReleased(MouseEvent arg0) {
			mousePressionado3 = false;
		}
		public void mouseEntered(MouseEvent e) {
		}
		public void mouseExited(MouseEvent e) {
		}
		
	});
	add(lBackground);
}

public class Mover extends Thread{
	public void run(){
		while(true){
			try{sleep(10);}catch(Exception erro){}
			if(mousePressionado){
				Point ponto = getMousePosition();
				lPeça1.setBounds(ponto.x-32, ponto.y-33, 65, 33);	
			}
			if(mousePressionado2){
				Point ponto = getMousePosition();
				lPeça2.setBounds(ponto.x-57, ponto.y-33, 115, 33);	
			}
			if(mousePressionado3){
				Point ponto = getMousePosition();
				lPeça3.setBounds(ponto.x-73, ponto.y-33, 147, 33);	
			}
		}
	
	}
}

public static void main(String[] args) {
	new JogoHanoi();

}

}

//Ele ta muito gambiarra e não importa oq eu faça sempre da um nó horrível, sei que to exigindo muito mas é minha ultima salvação//

2 Respostas

wldomiciano

Primeira coisa que já vai dar uma limpada no seu código:

Não use a interface MouseListener. Ela te obriga a implementar todos os seus 5 métodos sendo que você só usa dois de verdade. Ao invés disso use a class MouseAdapter, ela já cuida das implementações necessárias e você só precisa sobreescrever os métodos que você precisa.

Outra coisa, imagine uma peça. Pense em cada uma de suas caracteristicas. Toda peça tem um JLabel, um Icon, uma posição x e y assim como um valor para sua altura e largura; além disso todas tem o mesmo tipo de evento associado a elas.

Tendo isso em mente, crie uma classe para representar essa peça e coloque nesta classe todas as informações. Olha, eu fiz um rascunho rápido de como poderia ficar:

class Piece extends JLabel {
    int x; // posição X
    int y; // posição Y
    int w; // largura
    int h; // altura
    boolean mousePressed;
    
    Piece(String text, String icon, int x, int y, int w, int h) {
        super( text, new ImageIcon(icon), SwingConstants.CENTER );
        
        this.addMouseListener( new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent arg0) {
                mousePressed = true;
            }

            @Override
            public void mouseReleased(MouseEvent arg0) {
                mousePressed = false;
            }
        });
        
        this.setBounds(x, y, w, h);
        this.x = x;
        this.y = y;
    }
 
    // use este método sempre que quiser saber se o
    // mouse foi pressionado sobre a peça
    boolean mouseIsPressed() {
        return this.mousePressed;
    }
    
    // vi que setBounds é usado em 2 lugares no seu código
    // uma na criação da peça, que neste código é feito dentro do constructor
    // e outra dentro do método run, use este método lá
    void setBounds(int x, int y) {
        this.setBounds(x, y, this.w, this.h);
    }
}

Lembre-se, esta classe tá bem feia, voce teria que encontrar forma melhor de implementá-la, mas coloquei aqui apenas para lhe dar uma noção de por onde começar.

J

Cara, sério, muito obrigado, fiz tudo sozinho daí o pessoal da minha equipe sumiu, tava precisando de uma mãozinha pra desatar os nós do programa. Vou começar pelo que você disse e vê se assim da pra dividir tudo direitinho.

Criado 23 de fevereiro de 2016
Ultima resposta 24 de fev. de 2016
Respostas 2
Participantes 2