Hola a todos, recién me estoy iniciando en el mundo del java, me gusta la programación como un hobby, estoy siguiendo un manual que me pasaron hace tiempo y estoy en el tema de la GUI de java.
Estoy resolviendo problemas con eventos y dibujos, y estoy estancado en varios de estos problemas. por ejemplo en uno me piden crear cinco botones para mover la posicion de un punto en la ventana y vaya dibujando si esta activado un centinela.
Se que los eventos se dan porque en cada evento le doy un printf para ver en pantalla, y ademas tengo una etiqueta JTextField que se va actualizando según cada evento, aca no tengo problemas con los eventos. el problema es con el paintComponent o el método repaint (). Los datos que se van actualizando en con los eventos no se ven reflejados en el paintComponent, aqui siempre se quedan en cero, por lo que nunca logro dibujar nada. no se si me podrían ayudar. Dividi mi programa en dos clases uno para Dibujar y otro para los eventos de los botones.
Gracias de antemano quien me pueda ayudar y explicar cual puede ser el error, ya que varios de los problemas que quiero realizar del manual en el capitulo por lo que veo tendre el mismo problema.
Este es el que contiene los botones y etiqueta
package graficostortugaapi;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GraficosTortugaInterfaz extends JFrame {
private JButton plumaArriba;
private JButton plumaAbajo;
private JButton voltearDerecha;
private JButton voltearIzquierda;
private JButton avanzarAdelante;
private JTextField posicionTortuga;
private JPanel panelBotones;
GraficosTortugaAPI graficos;
public GraficosTortugaInterfaz () {
super ("Graficos Tortuga API");
panelBotones = new JPanel ();
panelBotones.setLayout (new GridLayout (1, 5));
graficos = new GraficosTortugaAPI ();
posicionTortuga = new JTextField (String.format ("Tortuga en posicion: "
+ "(%d, %d), %s", graficos.obtenerPosicionX (),
graficos.obtenerPosicionY (),
graficos.obtenerPluma() == true ?
"pluma abajo": "pluma arriba"));
posicionTortuga.setEditable (false);
plumaArriba = new JButton ("Pluma Arriba"); //Se mueve sin dibujar
plumaArriba.addActionListener (
new ActionListener (){
public void actionPerformed (ActionEvent evento){
graficos.establecerPluma(false);
posicionTortuga.setText (String.format ("Tortuga en "
+ "posicion: (%d, %d), %s",
graficos.obtenerPosicionX(),
graficos.obtenerPosicionY(),
graficos.obtenerPluma() == true ?
"pluma abajo": "pluma arriba"));
}
}
);
plumaAbajo = new JButton ("Pluma Abajo"); //Se mueve dibujando
plumaAbajo.addActionListener (
new ActionListener (){
public void actionPerformed (ActionEvent evento){
graficos.establecerPluma (true);
posicionTortuga.setText (String.format ("Tortuga en "
+ "posicion: (%d, %d), %s",
graficos.obtenerPosicionX(),
graficos.obtenerPosicionY(),
graficos.obtenerPluma() == true ?
"pluma abajo": "pluma arriba"));
}
}
);
voltearDerecha = new JButton ("Voltear Derecha"); //voltea a su derecha
voltearDerecha.addActionListener (
new ActionListener (){
public void actionPerformed (ActionEvent evento){
if (graficos.obtenerEstadoTortuga () == 0)
graficos.establecerEstadoTortuga (3);
else if (graficos.obtenerEstadoTortuga () == 1)
graficos.establecerEstadoTortuga (2);
else if (graficos.obtenerEstadoTortuga () == 2)
graficos.establecerEstadoTortuga (0);
else
graficos.establecerEstadoTortuga (1);
}
}
);
voltearIzquierda = new JButton ("Voltear Izquierda"); //voltea a su
voltearIzquierda.addActionListener ( //izquierda
new ActionListener (){
public void actionPerformed (ActionEvent evento){
if (graficos.obtenerEstadoTortuga () == 0)
graficos.establecerEstadoTortuga (2);
else if (graficos.obtenerEstadoTortuga () == 1)
graficos.establecerEstadoTortuga (3);
else if (graficos.obtenerEstadoTortuga () == 2)
graficos.establecerEstadoTortuga (1);
else
graficos.establecerEstadoTortuga (0);
}
}
);
avanzarAdelante = new JButton ("Avanza"); //avanza hacia delante
avanzarAdelante.addActionListener (
new ActionListener (){
public void actionPerformed (ActionEvent evento){
graficos.Avanza ();
posicionTortuga.setText (String.format ("Tortuga en "
+ "posicion: (%d, %d), %s",
graficos.obtenerPosicionX(),
graficos.obtenerPosicionY(),
graficos.obtenerPluma() == true ?
"pluma abajo": "pluma arriba"));
}
}
);
panelBotones.add (plumaArriba);
panelBotones.add (plumaAbajo);
panelBotones.add (voltearDerecha);
panelBotones.add (voltearIzquierda);
panelBotones.add (avanzarAdelante);
}
public JTextField obtenerTextoTortuga (){
return posicionTortuga;
}
public JPanel obtenerPanelBotones (){
return panelBotones;
}
}
Este es el que debe dibujar:
package graficostortugaapi;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GraficosTortugaAPI extends JPanel {
private int posicionHorizontal = 0;
private int posicionVertical = 0;
private boolean pluma = false;
private int estadoTortuga = 2;
private JPanel panelGraficos = new JPanel ();
private int puntos [][] = new int [2000000][2];
private int count = 0;
public void establecerPluma (boolean p){
pluma = p;
}
public boolean obtenerPluma (){
return pluma;
}
public void establecerEstadoTortuga (int estado){
estadoTortuga = estado;
}
public int obtenerEstadoTortuga (){
return estadoTortuga;
}
public int obtenerPosicionX (){
return posicionHorizontal;
}
public int obtenerPosicionY (){
return posicionVertical;
}
public void establecerNuevaPosicionX (int movimiento){
posicionHorizontal += movimiento;
if (obtenerPluma () == true){
establecerCount (1);
puntos [obtenerCount ()][0] = obtenerPosicionX ();
System.out.printf ("X: %d, ", puntos [obtenerCount ()][0]);
}
}
public void establecerNuevaPosicionY (int movimiento){
posicionVertical += movimiento;
if (obtenerPluma () == true){
puntos [obtenerCount ()][1] = obtenerPosicionY ();
System.out.printf ("Y: %d, ", puntos [obtenerCount ()][1]);
System.out.printf ("Count: %d\n", obtenerCount ());
}
}
public void establecerCount (int aumento){
count += aumento;
}
public int obtenerCount (){
return count;
}
public void Avanza (){
if (obtenerEstadoTortuga () == 2){
establecerNuevaPosicionX (15);
establecerNuevaPosicionY (0);
}else if (obtenerEstadoTortuga () == 3){
establecerNuevaPosicionX (-15);
establecerNuevaPosicionY (0);
}else if (obtenerEstadoTortuga () == 0){
establecerNuevaPosicionX (0);
establecerNuevaPosicionY (15);
}else{
establecerNuevaPosicionX (0);
establecerNuevaPosicionY (-15);
}
repaint ();
}
public void paintComponent (Graphics g){
super.paintComponent (g);
Graphics2D g2d = (Graphics2D) g;
for (int i = 0; i < obtenerCount (); i++){
g2d.setPaint (Color.BLUE);
g2d.draw (new Line2D.Double (puntos [i][0], puntos [i][1],
puntos [i][0] + 20, puntos [i][1] + 20));
g2d.draw (new Line2D.Double (puntos [i][0], puntos [i][1] + 20,
puntos [i][1] + 20, puntos [i][1]));
System.out.printf ("\n(%d, %d)\n", puntos [i][0], puntos[i][1]);
}
System.out.printf ("Ingreso %d\n", obtenerCount ());
}
}