Transformar de applet a aplicación
Hola, tengo el siguiente applet que quiero transformar en una aplicación:
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class P
extends Applet
implements KeyListener, FocusListener, MouseListener
{
static final int TAMANIO_CUADRO = 40;
Color colorCuadrado;
int cuadradoArriba, cuadradoIzquierda;
boolean conFoco = false;
public void init()
{
setBackground(Color.WHITE);
cuadradoArriba = getSize().height / 2 - TAMANIO_CUADRO / 2;
cuadradoIzquierda = getSize().width / 2 - TAMANIO_CUADRO / 2;
colorCuadrado = Color.RED;
addFocusListener(this);
addKeyListener(this);
addMouseListener(this);
}
public void paint(Graphics g)
{
if (conFoco)
g.setColor(Color.CYAN);
else
g.setColor(Color.LIGHT_GRAY);
int ancho = getSize().width;
int alto = getSize().height;
g.drawRect(0, 0, ancho - 1, alto - 1);
g.drawRect(1, 1, ancho - 3, alto - 3);
g.drawRect(2, 2, ancho - 5, alto - 5);
g.setColor(colorCuadrado);
g.fillRect(
cuadradoIzquierda,
cuadradoArriba,
TAMANIO_CUADRO,
TAMANIO_CUADRO);
if (!conFoco)
{
g.setColor(Color.MAGENTA);
g.drawString("Click para activar", 7, 20);
}
}
public void focusGained(FocusEvent e)
{
conFoco = true;
repaint();
}
public void focusLost(FocusEvent e)
{
conFoco = false;
repaint();
}
public void keyTyped(KeyEvent e)
{
char c = e.getKeyChar();
if (c == \'B\' || c == \'b\')
{
colorCuadrado = Color.BLUE;
repaint();
}
else if (c == \'G\' || c == \'g\')
{
colorCuadrado = Color.GREEN;
repaint();
}
else if (c == \'R\' || c == \'r\')
{
colorCuadrado = Color.RED;
repaint();
}
else if (c == \'K\' || c == \'k\')
{
colorCuadrado = Color.BLACK;
repaint();
}
}
public void keyPressed(KeyEvent e)
{
int tecla = e.getKeyCode();
if (tecla == KeyEvent.VK_LEFT)
{
cuadradoIzquierda -= 8;
if (cuadradoIzquierda < 3)
cuadradoIzquierda = 3;
repaint();
}
else if (tecla == KeyEvent.VK_RIGHT)
{
cuadradoIzquierda += 8;
if (cuadradoIzquierda > getSize().width - 3 - TAMANIO_CUADRO)
cuadradoIzquierda = getSize().width - 3 - TAMANIO_CUADRO;
repaint();
}
else if (tecla == KeyEvent.VK_UP)
{
cuadradoArriba -= 8;
if (cuadradoArriba < 3)
cuadradoArriba = 3;
repaint();
}
else if (tecla == KeyEvent.VK_DOWN)
{
cuadradoArriba += 8;
if (cuadradoArriba > getSize().height - 3 - TAMANIO_CUADRO)
cuadradoArriba = getSize().height - 3 - TAMANIO_CUADRO;
repaint();
}
}
public void keyReleased(KeyEvent e)
{
}
public void mousePressed(MouseEvent e)
{
requestFocus();
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
}
Para hacer la aplicación sustituyo extends Applet por extends Frame, añado public static void main(String[] args), sustituyo el método init() por el constructor y dentro de este añado show().. con lo que me queda:
import java.awt.*;
import java.awt.event.*;
public class Paplicacion
extends Frame
implements KeyListener, FocusListener, MouseListener
{
static final int TAMANIO_CUADRO = 40;
Color colorCuadrado;
int cuadradoArriba, cuadradoIzquierda;
boolean conFoco = false;
public static void main(String[] args)
{
new Paplicacion();
}
public Paplicacion()
{
setBackground(Color.WHITE);
cuadradoArriba = getSize().height / 2 - TAMANIO_CUADRO / 2;
cuadradoIzquierda = getSize().width / 2 - TAMANIO_CUADRO / 2;
colorCuadrado = Color.RED;
addFocusListener(this);
addKeyListener(this);
addMouseListener(this);
show();
}
public void paint(Graphics g)
{
if (conFoco)
g.setColor(Color.CYAN);
else
g.setColor(Color.LIGHT_GRAY);
int ancho = getSize().width;
int alto = getSize().height;
g.drawRect(0, 0, ancho - 1, alto - 1);
g.drawRect(1, 1, ancho - 3, alto - 3);
g.drawRect(2, 2, ancho - 5, alto - 5);
g.setColor(colorCuadrado);
g.fillRect(
cuadradoIzquierda,
cuadradoArriba,
TAMANIO_CUADRO,
TAMANIO_CUADRO);
if (!conFoco)
{
g.setColor(Color.MAGENTA);
g.drawString("Click para activar", 7, 20);
}
}
public void focusGained(FocusEvent e)
{
conFoco = true;
repaint();
}
public void focusLost(FocusEvent e)
{
conFoco = false;
repaint();
}
public void keyTyped(KeyEvent e)
{
// The user has typed a character, while the
// applet thas the input focus. If it is one
// of the keys that represents a color, change
// the color of the square and redraw the applet.
char c = e.getKeyChar(); // The character typed.
if (c == \'B\' || c == \'b\')
{
colorCuadrado = Color.BLUE;
repaint();
}
else if (c == \'G\' || c == \'g\')
{
colorCuadrado = Color.GREEN;
repaint();
}
else if (c == \'R\' || c == \'r\')
{
colorCuadrado = Color.RED;
repaint();
}
else if (c == \'K\' || c == \'k\')
{
colorCuadrado = Color.BLACK;
repaint();
}
}
public void keyPressed(KeyEvent e)
{
int tecla = e.getKeyCode();
if (tecla == KeyEvent.VK_LEFT)
{
cuadradoIzquierda -= 8;
if (cuadradoIzquierda < 3)
cuadradoIzquierda = 3;
repaint();
}
else if (tecla == KeyEvent.VK_RIGHT)
{
cuadradoIzquierda += 8;
if (cuadradoIzquierda > getSize().width - 3 - TAMANIO_CUADRO)
cuadradoIzquierda = getSize().width - 3 - TAMANIO_CUADRO;
repaint();
}
else if (tecla == KeyEvent.VK_UP)
{
cuadradoArriba -= 8;
if (cuadradoArriba < 3)
cuadradoArriba = 3;
repaint();
}
else if (tecla == KeyEvent.VK_DOWN)
{
cuadradoArriba += 8;
if (cuadradoArriba > getSize().height - 3 - TAMANIO_CUADRO)
cuadradoArriba = getSize().height - 3 - TAMANIO_CUADRO;
repaint();
}
}
public void keyReleased(KeyEvent e)
{
}
public void mousePressed(MouseEvent e)
{
requestFocus();
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
}
Pues aunque parezca estar bien, no lo está porque cuando ejecuto la aplicación en vez de mostrarme un frame, una ventana, con los elementos dentro, sólo me muestra la barra superior (donde iría el título) de la ventana. ¿Qué me falta? ¿qué se me olvida?
Muchas gracias
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class P
extends Applet
implements KeyListener, FocusListener, MouseListener
{
static final int TAMANIO_CUADRO = 40;
Color colorCuadrado;
int cuadradoArriba, cuadradoIzquierda;
boolean conFoco = false;
public void init()
{
setBackground(Color.WHITE);
cuadradoArriba = getSize().height / 2 - TAMANIO_CUADRO / 2;
cuadradoIzquierda = getSize().width / 2 - TAMANIO_CUADRO / 2;
colorCuadrado = Color.RED;
addFocusListener(this);
addKeyListener(this);
addMouseListener(this);
}
public void paint(Graphics g)
{
if (conFoco)
g.setColor(Color.CYAN);
else
g.setColor(Color.LIGHT_GRAY);
int ancho = getSize().width;
int alto = getSize().height;
g.drawRect(0, 0, ancho - 1, alto - 1);
g.drawRect(1, 1, ancho - 3, alto - 3);
g.drawRect(2, 2, ancho - 5, alto - 5);
g.setColor(colorCuadrado);
g.fillRect(
cuadradoIzquierda,
cuadradoArriba,
TAMANIO_CUADRO,
TAMANIO_CUADRO);
if (!conFoco)
{
g.setColor(Color.MAGENTA);
g.drawString("Click para activar", 7, 20);
}
}
public void focusGained(FocusEvent e)
{
conFoco = true;
repaint();
}
public void focusLost(FocusEvent e)
{
conFoco = false;
repaint();
}
public void keyTyped(KeyEvent e)
{
char c = e.getKeyChar();
if (c == \'B\' || c == \'b\')
{
colorCuadrado = Color.BLUE;
repaint();
}
else if (c == \'G\' || c == \'g\')
{
colorCuadrado = Color.GREEN;
repaint();
}
else if (c == \'R\' || c == \'r\')
{
colorCuadrado = Color.RED;
repaint();
}
else if (c == \'K\' || c == \'k\')
{
colorCuadrado = Color.BLACK;
repaint();
}
}
public void keyPressed(KeyEvent e)
{
int tecla = e.getKeyCode();
if (tecla == KeyEvent.VK_LEFT)
{
cuadradoIzquierda -= 8;
if (cuadradoIzquierda < 3)
cuadradoIzquierda = 3;
repaint();
}
else if (tecla == KeyEvent.VK_RIGHT)
{
cuadradoIzquierda += 8;
if (cuadradoIzquierda > getSize().width - 3 - TAMANIO_CUADRO)
cuadradoIzquierda = getSize().width - 3 - TAMANIO_CUADRO;
repaint();
}
else if (tecla == KeyEvent.VK_UP)
{
cuadradoArriba -= 8;
if (cuadradoArriba < 3)
cuadradoArriba = 3;
repaint();
}
else if (tecla == KeyEvent.VK_DOWN)
{
cuadradoArriba += 8;
if (cuadradoArriba > getSize().height - 3 - TAMANIO_CUADRO)
cuadradoArriba = getSize().height - 3 - TAMANIO_CUADRO;
repaint();
}
}
public void keyReleased(KeyEvent e)
{
}
public void mousePressed(MouseEvent e)
{
requestFocus();
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
}
Para hacer la aplicación sustituyo extends Applet por extends Frame, añado public static void main(String[] args), sustituyo el método init() por el constructor y dentro de este añado show().. con lo que me queda:
import java.awt.*;
import java.awt.event.*;
public class Paplicacion
extends Frame
implements KeyListener, FocusListener, MouseListener
{
static final int TAMANIO_CUADRO = 40;
Color colorCuadrado;
int cuadradoArriba, cuadradoIzquierda;
boolean conFoco = false;
public static void main(String[] args)
{
new Paplicacion();
}
public Paplicacion()
{
setBackground(Color.WHITE);
cuadradoArriba = getSize().height / 2 - TAMANIO_CUADRO / 2;
cuadradoIzquierda = getSize().width / 2 - TAMANIO_CUADRO / 2;
colorCuadrado = Color.RED;
addFocusListener(this);
addKeyListener(this);
addMouseListener(this);
show();
}
public void paint(Graphics g)
{
if (conFoco)
g.setColor(Color.CYAN);
else
g.setColor(Color.LIGHT_GRAY);
int ancho = getSize().width;
int alto = getSize().height;
g.drawRect(0, 0, ancho - 1, alto - 1);
g.drawRect(1, 1, ancho - 3, alto - 3);
g.drawRect(2, 2, ancho - 5, alto - 5);
g.setColor(colorCuadrado);
g.fillRect(
cuadradoIzquierda,
cuadradoArriba,
TAMANIO_CUADRO,
TAMANIO_CUADRO);
if (!conFoco)
{
g.setColor(Color.MAGENTA);
g.drawString("Click para activar", 7, 20);
}
}
public void focusGained(FocusEvent e)
{
conFoco = true;
repaint();
}
public void focusLost(FocusEvent e)
{
conFoco = false;
repaint();
}
public void keyTyped(KeyEvent e)
{
// The user has typed a character, while the
// applet thas the input focus. If it is one
// of the keys that represents a color, change
// the color of the square and redraw the applet.
char c = e.getKeyChar(); // The character typed.
if (c == \'B\' || c == \'b\')
{
colorCuadrado = Color.BLUE;
repaint();
}
else if (c == \'G\' || c == \'g\')
{
colorCuadrado = Color.GREEN;
repaint();
}
else if (c == \'R\' || c == \'r\')
{
colorCuadrado = Color.RED;
repaint();
}
else if (c == \'K\' || c == \'k\')
{
colorCuadrado = Color.BLACK;
repaint();
}
}
public void keyPressed(KeyEvent e)
{
int tecla = e.getKeyCode();
if (tecla == KeyEvent.VK_LEFT)
{
cuadradoIzquierda -= 8;
if (cuadradoIzquierda < 3)
cuadradoIzquierda = 3;
repaint();
}
else if (tecla == KeyEvent.VK_RIGHT)
{
cuadradoIzquierda += 8;
if (cuadradoIzquierda > getSize().width - 3 - TAMANIO_CUADRO)
cuadradoIzquierda = getSize().width - 3 - TAMANIO_CUADRO;
repaint();
}
else if (tecla == KeyEvent.VK_UP)
{
cuadradoArriba -= 8;
if (cuadradoArriba < 3)
cuadradoArriba = 3;
repaint();
}
else if (tecla == KeyEvent.VK_DOWN)
{
cuadradoArriba += 8;
if (cuadradoArriba > getSize().height - 3 - TAMANIO_CUADRO)
cuadradoArriba = getSize().height - 3 - TAMANIO_CUADRO;
repaint();
}
}
public void keyReleased(KeyEvent e)
{
}
public void mousePressed(MouseEvent e)
{
requestFocus();
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
}
Pues aunque parezca estar bien, no lo está porque cuando ejecuto la aplicación en vez de mostrarme un frame, una ventana, con los elementos dentro, sólo me muestra la barra superior (donde iría el título) de la ventana. ¿Qué me falta? ¿qué se me olvida?
Muchas gracias
Te voy a hacer una sugerencia, bueno 2, la primera:
Utiliza un MouseAdapter en lugar de un MouseListener para que no tengas que sobreescribir todos los metodos de la interfaz MouseListener.
segunda: en lugar de usar la sentencia 'implements KeyListener, FocusListener, MouseListener' crear un auditor de eventos individual en clases individuales.
Ahh y por ultimo considera seriamente abandonar el viejo Abstact Window Toolkit y usar las JFC (Swing en especial). Suerte y espero poder ayudarte.
Utiliza un MouseAdapter en lugar de un MouseListener para que no tengas que sobreescribir todos los metodos de la interfaz MouseListener.
segunda: en lugar de usar la sentencia 'implements KeyListener, FocusListener, MouseListener' crear un auditor de eventos individual en clases individuales.
Ahh y por ultimo considera seriamente abandonar el viejo Abstact Window Toolkit y usar las JFC (Swing en especial). Suerte y espero poder ayudarte.