import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* Pequeña aplicación que consisteen generar una linea pulsando el punto inicial y el punto final.
* Pulsando una tercera vez (cuando la linea se ha generado) se borrara la linea y se podra generar otra.
*
* @author Alejandro Gonzalez Hernandez
* @version 1.0
*/
public class Grid extends JFrame implements ActionListener{
static Grid gt = null; //malla
Coordenada inicial = null;
Coordenada finall = null;
ArrayList<JButton> repintar = new ArrayList<JButton>(); //array donde guardo los puntos que pinto para volver a restaurarlos
static int rows = 100; //numero de filas
static int cols = 100; //nmero columnas
int color = 0;
int flag = 0; //operacion a realizar (0 = punto ini, 1 = punto final, 2 = borrado)
private JButton botones[][] = new JButton[rows][cols]; //matriz de los botones
private Coordenada puntos[][] = new Coordenada[rows][cols]; // matriz de coordenadas de cada boton
public Grid(int rows, int cols) {
//crear el Grid con el numero de botones y las coordenadas
//asignar a cada boton un valor para recoger la accion
Container pane = getContentPane();
pane.setLayout(new GridLayout(rows, cols));
int val = 0; //valor a cada boton para distinguir cual presiono
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
JButton button = new JButton();
pane.add(button);
this.botones[rows-i-1][j] = button;
this.botones[rows-i-1][j].setActionCommand(val+"");
this.botones[rows-i-1][j].addActionListener(this);
this.puntos[rows-i-1][j] = new Coordenada(i, j);
val++;
}
}
}
/**
* Acciones al pulsar los botones
* flag = 0: boton inicial
* flag = 1: boton final
* flag = 2: borrado
*/
public void actionPerformed(ActionEvent e){
switch(flag){
case 2:
for (int i = 0; i < repintar.size(); i++){
repintar.get(i).setBackground(null);
}
flag = 0; break;
case 1:
int val = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if(e.getActionCommand().equals(val+"")){
this.finall = this.puntos[i][j];
//System.out.println(this.finall.toString());
flag = 2;
linea();
}
val++;
}
} break;
case 0:
int val2 = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if(e.getActionCommand().equals(val2+"")){
this.inicial = this.puntos[i][j];
this.botones[rows-i-1][j].setBackground(Color.WHITE);
flag = 1;
//System.out.println(this.inicial.toString());
}
val2++;
}
} break;
}//switch
}
/**
* Algoritmo que genera y dibuja la linea entre ambos puntos
*/
public void linea(){
Color colLinea = null;
color = (int) (Math.random() * 6) + 1;
switch(color){
case 1: colLinea = Color.BLACK; break;
case 2: colLinea = Color.BLUE; break;
case 3: colLinea = Color.RED; break;
case 4: colLinea = Color.YELLOW; break;
case 5: colLinea = Color.GREEN; break;
case 6: colLinea = Color.MAGENTA; break;
}
int Xini = this.inicial.x();
int Yini = this.inicial.y();
int Xfin = this.finall.x();
int Yfin = this.finall.y();
double X = 0;
double Y = 0;
double L = 0;
double difX = Math.abs(Xfin - Xini);
double difY = Math.abs(Yfin - Yini);
if(difX >= difY){
L = difX;
}else{
L = difY;
}
difX = (Xfin - Xini) / L;
difY = (Yfin - Yini) / L;
X = Xini + 0.5;
Y = Yini + 0.5;
int i = 0;
while(i <= L){
botones[(int) Math.floor(X)][(int) Math.floor(Y)].setBackground(colLinea);
this.repintar.add(botones[(int) Math.floor(X)][(int) Math.floor(Y)]);
X = X + difX;
Y = Y + difY;
i++;
}
}
/**
* Main que crea la malla con los botones y el tamñana de la interfaz
*/
public static void main(String[] args) {
//crear el Grid con los botones y darle la opcion de cerrar
gt = new Grid(rows, cols);
gt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gt.pack();
gt.setVisible(true);
}
}
/**
* Clase que almacena la coordenada de cada boton de la malla
*
* @author Alejandro Gonzalez Hernandez
*
*/
public class Coordenada {
private int X;
private int Y;
public Coordenada(int x, int y){
this.X=x;
this.Y=y;
}
public int x(){
return this.X;
}
public int y(){
return this.Y;
}
public void setX(int x){
this.X=x;
}
public void setY(int y){
this.Y=y;
}
public String toString(){
return this.X + " " + this.Y;
}
}