1
C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más / Re:Java mover circulo en pantalla Graphics2D según eventos teclado KeyAdapter Timer
« en: 29 de Noviembre 2015, 13:15 »
Muchas gracias Cesar!
Aprende Java con el libro "Aprender a programar en Java desde cero. Curso paso a paso." Editorial aprenderaprogramar. com. 200 pgs. Disponible en papel y ebook.
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;
import javax.swing.*;
public class Bola1 extends JFrame{
Panell panel=new Panell();
public Bola1(){
super("Bola Movimientoo");
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(panel);
setVisible(true);
}
public static void main(String[]args){
Bola1 bolita=new Bola1();
}
}
class Panell extends JPanel implements ActionListener{
BolaMovimientos bolaMov=new BolaMovimientos(this);
Timer timer;
public Panell(){
setFocusable(true);
addKeyListener(new teclado());
timer=new Timer(15,this);
timer.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
g2.setColor(Color.red);
g2.fillOval(bolaMov.getX(), bolaMov.getY(), 30, 30);
}
@Override
public void actionPerformed(ActionEvent e) {
bolaMov.mover();
repaint();
}
private class teclado extends KeyAdapter{
public void keyReleased(KeyEvent e){
bolaMov.keyReleased(e);
}
public void keyPressed(KeyEvent e){
bolaMov.keyPressed(e);
}
}
}
class BolaMovimientos{
Panell panel1;
int x=1;
int y=1;
int dx=0;
int dy=0;
public BolaMovimientos(Panell panelito){
this.panel1=panelito;
}
public void mover(){
x=x+dx;
y=y+dy;
if((x+dx)>panel1.getWidth()-30){
dx=-1;
}else if((x+dx)<0){
dx=1;
}else if((y+dy)>panel1.getHeight()-30){
dy=-1;
}else if((y+dy)<0){
dy=1;
}
}
public void keyPressed(KeyEvent e){
int key=e.getExtendedKeyCode();
if(key==KeyEvent.VK_LEFT){
dx=-1;
dy=0;
}
if(key==KeyEvent.VK_RIGHT){
dx=1;
dy=0;
}
if(key==KeyEvent.VK_UP){
dx=0;
dy=-1;
}
if(key==KeyEvent.VK_DOWN){
dx=0;
dy=1;
}
}
public void keyReleased(KeyEvent e){
int key=e.getExtendedKeyCode();
if(key==KeyEvent.VK_LEFT){
}
if(key==KeyEvent.VK_RIGHT){
}
if(key==KeyEvent.VK_UP){
}
if(key==KeyEvent.VK_DOWN){
}
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
package masPrueb;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Cambi extends JFrame {
JPanel principal;
JPanel arriba;
static JButton rojit;
static Panel2 pan;
public Cambi(){
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principal=new JPanel();
arriba=new JPanel();
rojit=new JButton("Rojo");
pan=new Panel2();
rojit.addActionListener(pan);
BoxLayout vertical=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(vertical);
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.add(rojit);
principal.add(arriba);
principal.add(pan);
add(principal);
setVisible(true);
}
public static void main(String[]args){
new Cambi();
}
}
class Panel2 extends JPanel implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object fuente=e.getSource();
if(fuente==Cambi.rojit){
Cambi.pan.setBackground(Color.red);
}
}
}
Este sería el segundo programa(las dudas que tengo las he puesto como comentarios). Sé que este funciona correctamente pero quisiera aclarar las dudas que he puesto en los comentarios:package otra.vez.eventos;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class CambioColor2Clases extends JFrame {
JPanel principal;
JPanel arriba;
JButton azulit;
Panel2 pan;
public CambioColor2Clases(){
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principal=new JPanel();
arriba=new JPanel();
azulit=new JButton("Azul");
pan=new Panel2(this);
azulit.addActionListener(pan);
BoxLayout vertical=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(vertical);
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.add(azulit);
principal.add(arriba);
principal.add(pan);
add(principal);
setVisible(true);
}
public static void main(String[]args){
new CambioColor2Clases();
}
}
class Panel2 extends JPanel implements ActionListener{
//Mi duda empieza desde este punto hasta......
CambioColor2Clases cam2;
Panel2(CambioColor2Clases c2){
this.cam2=c2;
}
//..........Mi duda termina en este punto
/*O sea mi duda aqui es por que no tengo que crear el objeto para
* poder "conectar" las dos clases...o ¿ es porque al declarar
* "CambioColor2Clases cam2" y despues en el constructor pasarle como
* argumento "CambioColor2Clases c2" e igualarlo, así estoy creando
* indirectamente el objeto?????Esa es basicamente mi duda en este programa
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object fuente=e.getSource();
if(fuente==cam2.azulit){
cam2.pan.setBackground(Color.blue);
}
}
}
Y este es tercer programa , el cual no me funciona, las dudas las escribo en los comentariospackage masPrueb1;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Cambi extends JFrame {
JPanel principal;
JPanel arriba;
JButton verde;
Panel2 pan;
public Cambi(){
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principal=new JPanel();
arriba=new JPanel();
verde=new JButton("verde");
pan=new Panel2();
verde.addActionListener(pan);
BoxLayout vertical=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(vertical);
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.add(verde);
principal.add(arriba);
principal.add(pan);
add(principal);
setVisible(true);
}
public static void main(String[]args){
new Cambi();
}
}
class Panel2 extends JPanel implements ActionListener{
Cambi c=new Cambi(); //Aqui creo un objeto de Cambi para poder usarlo
//en el metodo actionPerformed, pero al usar "c.verde" o "c.pan" en el
//metodo actionPerformed, ahí no lo detecta y no sé por qué
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object fuente=e.getSource();
if(fuente==c.verde){
c.pan.setBackground(Color.green);
}
}
}
Quisiera aclarar que lo sé hacer de una manera más ordenada y con un diseño más coherente(me indicó a hacerlo de la manera correcta uno de los expertos de este foro), pero quisiera saber(independientemente del diseño) cuales son los fallos del tercer programa, y la explicación que expongo en los comentarios del segundo. Basicamente lo que hago es “experimentar” varias formas de hacer un mismo ejercicio para así entender el “por qué” de los posibles erroresCreo, y digo creo, que debes usar return para entregar el objeto creado al asignar la clase PanelArriba cuando quieras usarlo fuera de esa función. Si no simplemente creas un objeto de caracter local, entiendo.Hola SamML. Gracias por la respuesta. Es posible que te haya entendido mal, pero en principio no puedo usar return, ya que sería en el metodo "public void actionPerformed(ActionEvent e)" y este es un metodo (de tipo void)de la interface ActionListener
Saludos.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();
PanelArriba arriba=new PanelArriba(this);
JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");
public PanelPrincipal(){
super("Panel principal");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rojo.addActionListener(arriba);
azul.addActionListener(arriba);
panel2.add(rojo);
panel2.add(azul);
principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(horizontal);
principal.add(arriba);
principal.add(panel2);
add(principal);
setVisible(true);
}
public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();
}
}
class PanelArriba extends JPanel implements ActionListener{
PanelPrincipal pa;
public PanelArriba(PanelPrincipal princip){
this.pa=princip;
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob=e.getSource();
if(ob==pa.azul){
setBackground(Color.blue);
}else if(ob==pa.rojo){
setBackground(Color.red);
}
}
}
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();
PanelArriba arriba=new PanelArriba(); //Aqui hay un cambio con respecto al primer programa.
//Esta linea anteriormente era---->"PanelArriba arriba=new PanelArriba(this);"
JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");
public PanelPrincipal(){
super("Panel principal");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rojo.addActionListener(arriba);
azul.addActionListener(arriba);
panel2.add(rojo);
panel2.add(azul);
principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(horizontal);
principal.add(arriba);
principal.add(panel2);
add(principal);
setVisible(true);
}
public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();
}
}
class PanelArriba extends JPanel implements ActionListener{
PanelPrincipal pa=new PanelPrincipal();
//En el programa anterior aqui tenía un constructor y le pasaba como parametros "PanelPrincipal princip" ...
//...en este al no tener que pasarle parametro no hago un constructor
@Override
public void actionPerformed(ActionEvent e) {
Object ob=e.getSource();
if(ob==pa.azul){
setBackground(Color.blue);
}else if(ob==pa.rojo){
setBackground(Color.red);
}
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BotonCambioColor2 extends JFrame{
JPanel principal=new JPanel();
Panel1 p1;
Panel2 p2;
public BotonCambioColor2(){
super("Titulo de la barra");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,400);
p1=new Panel1();
p2=new Panel2(p1); //Creo que debo pasarle p1...analizarlo bien
p1.setBorder(BorderFactory.createLineBorder(Color.black));
p2.setBorder(BorderFactory.createLineBorder(Color.black));
BoxLayout disenyo=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(disenyo);
principal.add(p1);
principal.add(p2);
add(principal);
setVisible(true);
}
public static void main(String[]args){
BotonCambioColor2 bot=new BotonCambioColor2();
}
}
class Panel1 extends JPanel{
JButton azulito;
JButton rojito;
Panel2 pane=new Panel2(this);
Panel1(){
azulito=new JButton("Azul");
rojito=new JButton("Rojo");
azulito.addActionListener(pane);
rojito.addActionListener(pane);
add(azulito);
add(rojito);
}
}
class Panel2 extends JPanel implements ActionListener{
Panel1 pan;
public Panel2(Panel1 panee){
pan=panee;
}
@Override
public void actionPerformed(ActionEvent e) {
Object fuente=e.getSource();
if(fuente==pan.azulito){
setBackground(Color.blue);
}else if(fuente==pan.rojito){
setBackground(Color.red);
}
}
}
package Ejer6;
import java.awt.*;
import javax.swing.*;
public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();
PanelArriba arriba=new PanelArriba(this);
JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");
JButton a=new JButton("A");
JButton b=new JButton("B");
JButton c=new JButton("C");
public PanelPrincipal(){
super("Panel principal");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rojo.addActionListener(arriba);
azul.addActionListener(arriba);
a.addActionListener(arriba);
b.addActionListener(arriba);
c.addActionListener(arriba);
panel2.add(rojo);
panel2.add(azul);
panel3.add(a);
panel3.add(b);
panel3.add(c);
principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));
panel3.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(horizontal);
principal.add(arriba);
principal.add(panel2);
principal.add(panel3);
add(principal);
setVisible(true);
}
public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();
}
}
package Ejer6;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PanelArriba extends JPanel implements ActionListener{
PanelPrincipal pa;
JLabel etiqueta=new JLabel();
public PanelArriba(PanelPrincipal princip){
this.pa=princip;
add(etiqueta);
}
@Override
public void actionPerformed(ActionEvent e) {
Object ob=e.getSource();
if(ob==pa.azul){
setBackground(Color.blue);
}else if(ob==pa.rojo){
setBackground(Color.red);
}else if(ob==pa.a){
etiqueta.setText("A");
}else if(ob==pa.b){
etiqueta.setText("B");
}else if(ob==pa.c){
etiqueta.setText("C");
}
}
}
package naveVoladora;
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
public class Nave {
private String nave="nave.gif";
private int dx;
private int dy;
private int x;
private int y;
private Image imagen; //"Image" es una clase que debemos importar que está dentro de java.awt
public Nave(){
x=40; //inicializamos "x" e "y" en 40 y 60 respectivamente
y=60;
ImageIcon img=new ImageIcon(this.getClass().getResource(nave));//busca un recurso llamado "nave", o sea busca la imagen
//que queremos que se nos muestre en la pantalla
imagen=img.getImage();//Se llama al archivo nave...o sea "extraemos" nuestro archivo para que sea mostrado
}
public void mover(){
//"x" e "y" representan la posicion de la imagen
x+=dx;
y+=dy;
}
public int tenerX(){
return x;
}
public int tenerY(){
return y;
}
public Image tenerImagen(){
return imagen;
}
//eventos que responden al teclado...a continuacion hacemos los metodos de la clase keyAdapter (los metodos
//son keyPressed y keyReleased)
//O sea el "keyPressed" es cuando estamos presionando las teclas y el "keyReleased" es cuando dejamos de presionar las teclas
public void keyPressed(KeyEvent e){
int key=e.getKeyCode();//Creo que obtiene la tecla que estemos pulsando en el teclado(en el video dice "el numero"
//pero la logica me dice que obtiene simplemente la tecla, no solo numero
if(key==KeyEvent.VK_LEFT){//Si se presiona la flecha de la izquierda, dx tendrá un valor de "-1"..y la nave va a la izquierda
dx=-1;
}
if(key==KeyEvent.VK_RIGHT){
dx=1;//Si se presiona la flecha de la derecha, la nave va a la derecha
}
if(key==KeyEvent.VK_UP){
dy=-1; //Si se presiona la flecha de arriba, la nave va hacia arriba
}
if(key==KeyEvent.VK_DOWN){
dy=1; //Si se presiona la flecha de abajo, la nave hacia abajo
}
}
public void keyReleased(KeyEvent e){//Cuando se deja de presionar una tecla
int key=e.getKeyCode();
if(key==KeyEvent.VK_LEFT){
dx=0; //Se da un valor de 0 para que el objeto deje de moverse..asi con cada opcion..
//o sea cuando dejemos de pulsar una flecha la imagen se detendrá
}
if(key==KeyEvent.VK_RIGHT){
dx=0;
}
if(key==KeyEvent.VK_UP){
dy=0;
}
if(key==KeyEvent.VK_DOWN){
dy=0;
}
}
}
package naveVoladora;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Dibujar extends JPanel implements ActionListener{
private Nave nave;//para que todos los metodos la reconozcan(es de suponer que se refiere a la nave)
private Timer timer;
public Dibujar(){
setBackground(Color.white);//Color de fondo
setFocusable(true);//para que el teclado detecte el color de fondo
addKeyListener(new teclado());//se declara la clase teclado
nave=new Nave();
timer=new Timer(15,this);//maneja la velocidad a la que ira la nave(o sea 15 es la velocidad en la que queremos
//que se mueva nuestra imagen
timer.start();//empieza a contar cada 5 milisegundos se efectuara un cambio
}
public void paint(Graphics grafica){//dibujar la nave
super.paint(grafica);//pinta la grafica en la superclase paint
Graphics2D g2=(Graphics2D)grafica;
g2.drawImage(nave.tenerImagen(), nave.tenerX(), nave.tenerY(), null); //dibuja la imagen y
//se llama la funcion y las..
}
@Override
public void actionPerformed(ActionEvent e) {
nave.mover();
repaint();//para que se vuelva a dibujar la imagen en el tablero
}
private class teclado extends KeyAdapter{//Se llama a los 2 eventos que hay
public void keyReleasesd(KeyEvent e){
nave.keyReleased(e);
}
public void keyPressed(KeyEvent e){
nave.keyPressed(e);
}
}
}
package naveVoladora;
import javax.swing.*;
public class Ventana extends JFrame{
public Ventana(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(new Dibujar());//se incluye la clase Dibujar
setTitle("Crear animacion Imagen en Movimiento");
setSize(800,600);
setVisible(true);
setLocationRelativeTo(null);//Para que nuestra ventana se centre
setResizable(false);
}
public static void main(String[]args){
new Ventana();
}
}
import javax.swing.*;
import java.awt.*;
public class Calculadora extends JFrame{
JPanel principal;
JPanel arriba;
JPanel medio;
JPanel izq;
JPanel der;
JPanel abajo;
JTextField campo;
JTextField campo1;
RestaSuma eventos=new RestaSuma(this);
public Calculadora(){
super("Calculadora");
setSize(400,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Panel principal
principal=new JPanel();
BoxLayout todo=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(todo);
//Primer Panel
arriba=new JPanel();
campo=new JTextField(30);
//campo.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); -->Hace que el cursor esté
//en el campo de texto en el lado derecho en lugar del izquierdo
campo1=new JTextField(30);
campo1.setEditable(false);
arriba.add(campo);
arriba.add(campo1);
//Panel Medio
medio=new JPanel();
medio.setLayout(new GridLayout(1,2,10,10));
//Panel izquierda
izq=new JPanel();
izq.setLayout(new GridLayout(4,3,5,5));
JButton num1=new JButton("1");
JButton num2=new JButton("2");
JButton num3=new JButton("3");
JButton num4=new JButton("4");
JButton num5=new JButton("5");
JButton num6=new JButton("6");
JButton num7=new JButton("7");
JButton num8=new JButton("8");
JButton num9=new JButton("9");
JButton num0=new JButton("0");
JButton coma=new JButton(",");
num1.addActionListener(eventos);
num2.addActionListener(eventos);
num3.addActionListener(eventos);
num4.addActionListener(eventos);
num5.addActionListener(eventos);
num6.addActionListener(eventos);
num7.addActionListener(eventos);
num8.addActionListener(eventos);
num9.addActionListener(eventos);
num0.addActionListener(eventos);
coma.addActionListener(eventos);
izq.add(num1);
izq.add(num2);
izq.add(num3);
izq.add(num4);
izq.add(num5);
izq.add(num6);
izq.add(num7);
izq.add(num8);
izq.add(num9);
izq.add(num0);
izq.add(coma);
//Panel derecha
der=new JPanel();
der=new JPanel();
der.setLayout(new GridLayout(4,3,5,5));
JButton mas=new JButton("+");
JButton menos=new JButton("-");
JButton mult=new JButton("*");
JButton div=new JButton("/");
JButton igual=new JButton("=");
JButton c=new JButton("C");
JButton flecha=new JButton("<==");
mas.addActionListener(eventos);
menos.addActionListener(eventos);
mult.addActionListener(eventos);
div.addActionListener(eventos);
igual.addActionListener(eventos);
c.addActionListener(eventos);
flecha.addActionListener(eventos);
der.add(mas);
der.add(menos);
der.add(mult);
der.add(div);
der.add(igual);
der.add(c);
der.add(flecha);
medio.add(izq);
medio.add(der);
//Panel abajo
abajo=new JPanel();
principal.add(arriba);
principal.add(medio);
principal.add(abajo);
add(principal);
setVisible(true);
}
public static void main(String[]args){
Calculadora cal=new Calculadora();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RestaSuma implements ActionListener{
Calculadora ca;
String texto;
static String signo;
static double acumulador=0;
public RestaSuma(Calculadora calcul){
ca=calcul;
}
public boolean existePunto(String cadena){ //Metodo que comprueba si existe un punto en los caracteres introducidos
boolean resultado=false;
for(int i=0;i<cadena.length();i++){
if(cadena.substring(i, i+1).equals(".")){
resultado=true;
break;
}
}
return resultado;
}
public void signoMetodo(String signo){
if(signo.equals("+")){
texto=ca.campo.getText();
acumulador=acumulador+Double.parseDouble(texto);
//¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡EL FALLO ESTÁ AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*Mi intencion es que si hago la resta:
*
* -Si resto 0-3 de resultado -3
*
* -Si resto 5-2 de resultado 3
*
* -Si hago 3+2-1 de resultado 4
*
*
* Ahora mismo los resulados son correcto excepto si resto 0 por un numero..me da un resultado positivo,
* en lugar de negativo o tambien ocurre lo mismo si hago 2-2-1-->ya que es 2-2=0 y 0 -un numero me ocurre ese fallo
*
*
*
*
*
*/
}else if(signo.equals("-")){
texto=ca.campo.getText();
if(acumulador!=0){
acumulador=acumulador-Double.parseDouble(texto);
}else if(acumulador==0){
double acumulador1=Double.parseDouble(texto);
acumulador=acumulador1-acumulador*-1;
}
}
}
@Override
public void actionPerformed(ActionEvent ev) {
String comando=ev.getActionCommand();
if(comando.equals("1")){
ca.campo.setText(ca.campo.getText()+"1"); //Lo hago de esta manera para que al pulsar
//un numero, el numero que ya estaba en el campo de texto se mantenga
}else if(comando.equals("2")){
ca.campo.setText(ca.campo.getText()+"2");
}else if(comando.equals("3")){
ca.campo.setText(ca.campo.getText()+"3");
}else if(comando.equals("4")){
ca.campo.setText(ca.campo.getText()+"4");
}else if(comando.equals("5")){
ca.campo.setText(ca.campo.getText()+"5");
}else if(comando.equals("6")){
ca.campo.setText(ca.campo.getText()+"6");
}else if(comando.equals("7")){
ca.campo.setText(ca.campo.getText()+"7");
}else if(comando.equals("8")){
ca.campo.setText(ca.campo.getText()+"8");
}else if(comando.equals("9")){
ca.campo.setText(ca.campo.getText()+"9");
}else if(comando.equals("0")){
ca.campo.setText(ca.campo.getText()+"0");
}else if(comando.equals("<==")){ //Aqui borro el ultimo caracter escrito
String cadena=ca.campo.getText();
if(cadena.length()>0){
ca.campo.setText(cadena.substring(0,(cadena.length()-1)));//Con esto lo que hace
//es escribir la cadena desde 0 hasta la longitud de la cadena-1, o sea
//no escribe el ultimo valor, o sea aparentemente borra el ultimo valor
}
}else if(comando.equals(",")){
if(ca.campo.getText().equals("")){
ca.campo.setText("0.");
} else{
if(!existePunto(ca.campo.getText())){
/*el metodo "existePunto" devuelve "true" en caso de existir un punto, si no existe
* entonces escribe el punto
*/
ca.campo.setText(ca.campo.getText()+",");
}
}
}else if(comando.equals("C")){
ca.campo.setText("");
ca.campo1.setText("");
acumulador=0;
}
if(comando.equals("+")){
if(signo==null){
signo="+"; //Esto del "signo" lo hago para así poder continuar sumando o restando a
//una operación ya hecha...por ejemplo si he puesto "5-3"..y quisiera sumarle +4..
//..o sea 5-3+4, al hacerlo de esta manera me funciona correctamente, si no lo hiciera así
//entonces me daría un error...si
//Por ejemplo:
/*empiezo una operación: 5+3..antes de empezar signo=null, despues signo="+"
* y hago la operación 5+3..al terminarla "signo=+"...
*
* continuo la operacion: resto 2 al resultado....o sea 5+3-2
*
* en ese momento el signo actual es "+", pero al pulsar "-" el signo actual pasa a "-"
* y realizo la resta..
*
* Si no lo hiciera de esta manera al hacer una operacion con dos signos diferentes, entonces
* no me la haria correctamente...si pusiera 5+3 y despues "-"2,al pulsar el "-" automaticamente
* me restaría 5-3....ASI QUE ESTA MANERA ES UNA SOLUCION QUE HE ENCONTRADO A ESE PROBLEMA...
* ..PERO IGUALMENTE AQUI NO ESTÁ MI DUDA.
*
*
*
*/
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){ //Si hay algo escrito en el campo de texto "campo", entonces
//escribe el acumulador en el "campo1" y borra "campo"...(el acumulador ya se ha calculado
//con el metodo "signoMetodo(signo);")
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
signo="+";
}
}else if(comando.equals("-")){
if(signo==null){
signo="-";
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
signo="-";
}
}else if(comando.equals("=")){
if(signo==null){
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
acumulador=0;
}
}
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RestaSuma implements ActionListener{
Calculadora ca;
String texto;
static String signo;
static double acumulador=0;
public RestaSuma(Calculadora calcul){
ca=calcul;
}
public boolean existePunto(String cadena){ //Metodo que comprueba si existe un punto en los caracteres introducidos
boolean resultado=false;
for(int i=0;i<cadena.length();i++){
if(cadena.substring(i, i+1).equals(".")){
resultado=true;
break;
}
}
return resultado;
}
public void signoMetodo(String signo){
if(signo.equals("+")){
texto=ca.campo.getText();
acumulador=acumulador+Double.parseDouble(texto);
//¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡EL FALLO ESTÁ AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*Mi intencion es que si hago la resta:
*
* -Si resto 0-3 de resultado -3
*
* -Si resto 5-2 de resultado 3
*
* -Si hago 3+2-1 de resultado 4
*
*
* Ahora mismo los resulados son correcto excepto si resto 0 por un numero..me da un resultado positivo,
* en lugar de negativo o tambien ocurre lo mismo si hago 2-2-1-->ya que es 2-2=0 y 0 -un numero me ocurre ese fallo
*
*
*
*
*
*/
}else if(signo.equals("-")){
texto=ca.campo.getText();
if(acumulador!=0){
acumulador=acumulador-Double.parseDouble(texto);
}else if(acumulador==0){
double acumulador1=Double.parseDouble(texto);
acumulador=acumulador1-acumulador*-1;
}
}
}
@Override
public void actionPerformed(ActionEvent ev) {
String comando=ev.getActionCommand();
if(comando.equals("1")){
ca.campo.setText(ca.campo.getText()+"1"); //Lo hago de esta manera para que al pulsar
//un numero, el numero que ya estaba en el campo de texto se mantenga
}else if(comando.equals("2")){
ca.campo.setText(ca.campo.getText()+"2");
}else if(comando.equals("3")){
ca.campo.setText(ca.campo.getText()+"3");
}else if(comando.equals("4")){
ca.campo.setText(ca.campo.getText()+"4");
}else if(comando.equals("5")){
ca.campo.setText(ca.campo.getText()+"5");
}else if(comando.equals("6")){
ca.campo.setText(ca.campo.getText()+"6");
}else if(comando.equals("7")){
ca.campo.setText(ca.campo.getText()+"7");
}else if(comando.equals("8")){
ca.campo.setText(ca.campo.getText()+"8");
}else if(comando.equals("9")){
ca.campo.setText(ca.campo.getText()+"9");
}else if(comando.equals("0")){
ca.campo.setText(ca.campo.getText()+"0");
}else if(comando.equals("<==")){ //Aqui borro el ultimo caracter escrito
String cadena=ca.campo.getText();
if(cadena.length()>0){
ca.campo.setText(cadena.substring(0,(cadena.length()-1)));//Con esto lo que hace
//es escribir la cadena desde 0 hasta la longitud de la cadena-1, o sea
//no escribe el ultimo valor, o sea aparentemente borra el ultimo valor
}
}else if(comando.equals(",")){
if(ca.campo.getText().equals("")){
ca.campo.setText("0.");
} else{
if(!existePunto(ca.campo.getText())){
/*el metodo "existePunto" devuelve "true" en caso de existir un punto, si no existe
* entonces escribe el punto
*/
ca.campo.setText(ca.campo.getText()+",");
}
}
}else if(comando.equals("C")){
ca.campo.setText("");
ca.campo1.setText("");
acumulador=0;
}
if(comando.equals("+")){
if(signo==null){
signo="+"; //Esto del "signo" lo hago para así poder continuar sumando o restando a
//una operación ya hecha...por ejemplo si he puesto "5-3"..y quisiera sumarle +4..
//..o sea 5-3+4, al hacerlo de esta manera me funciona correctamente, si no lo hiciera así
//entonces me daría un error...si
//Por ejemplo:
/*empiezo una operación: 5+3..antes de empezar signo=null, despues signo="+"
* y hago la operación 5+3..al terminarla "signo=+"...
*
* continuo la operacion: resto 2 al resultado....o sea 5+3-2
*
* en ese momento el signo actual es "+", pero al pulsar "-" el signo actual pasa a "-"
* y realizo la resta..
*
* Si no lo hiciera de esta manera al hacer una operacion con dos signos diferentes, entonces
* no me la haria correctamente...si pusiera 5+3 y despues "-"2,al pulsar el "-" automaticamente
* me restaría 5-3....ASI QUE ESTA MANERA ES UNA SOLUCION QUE HE ENCONTRADO A ESE PROBLEMA...
* ..PERO IGUALMENTE AQUI NO ESTÁ MI DUDA.
*
*
*
*/
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){ //Si hay algo escrito en el campo de texto "campo", entonces
//escribe el acumulador en el "campo1" y borra "campo"...(el acumulador ya se ha calculado
//con el metodo "signoMetodo(signo);")
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
signo="+";
}
}else if(comando.equals("-")){
if(signo==null){
signo="-";
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
signo="-";
}
}else if(comando.equals("=")){
if(signo==null){
}
signoMetodo(signo);
if(!ca.campo.getText().equals("")){
String text;
text=Double.toString(acumulador);
ca.campo.setText("");
ca.campo1.setText(text);
acumulador=0;
}
}
}
}
import javax.swing.*;
import java.awt.*;
public class Calculadora extends JFrame{
JPanel principal;
JPanel arriba;
JPanel medio;
JPanel izq;
JPanel der;
JPanel abajo;
JTextField campo;
JTextField campo1;
CalculadoraEventos eventos=new CalculadoraEventos(this);
public Calculadora(){
super("Calculadora");
setSize(400,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Panel principal
principal=new JPanel();
BoxLayout todo=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(todo);
//Primer Panel
arriba=new JPanel();
campo=new JTextField(30);
//campo.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); -->Hace que el cursor esté
//en el campo de texto en el lado derecho en lugar del izquierdo
campo1=new JTextField(30);
campo1.setEditable(false);
arriba.add(campo);
arriba.add(campo1);
//Panel Medio
medio=new JPanel();
medio.setLayout(new GridLayout(1,2,10,10));
//Panel izquierda
izq=new JPanel();
izq.setLayout(new GridLayout(4,3,5,5));
JButton num1=new JButton("1");
JButton num2=new JButton("2");
JButton num3=new JButton("3");
JButton num4=new JButton("4");
JButton num5=new JButton("5");
JButton num6=new JButton("6");
JButton num7=new JButton("7");
JButton num8=new JButton("8");
JButton num9=new JButton("9");
JButton num0=new JButton("0");
JButton coma=new JButton(",");
num1.addActionListener(eventos);
num2.addActionListener(eventos);
num3.addActionListener(eventos);
num4.addActionListener(eventos);
num5.addActionListener(eventos);
num6.addActionListener(eventos);
num7.addActionListener(eventos);
num8.addActionListener(eventos);
num9.addActionListener(eventos);
num0.addActionListener(eventos);
coma.addActionListener(eventos);
izq.add(num1);
izq.add(num2);
izq.add(num3);
izq.add(num4);
izq.add(num5);
izq.add(num6);
izq.add(num7);
izq.add(num8);
izq.add(num9);
izq.add(num0);
izq.add(coma);
//Panel derecha
der=new JPanel();
der=new JPanel();
der.setLayout(new GridLayout(4,3,5,5));
JButton mas=new JButton("+");
JButton menos=new JButton("-");
JButton mult=new JButton("*");
JButton div=new JButton("/");
JButton igual=new JButton("=");
JButton c=new JButton("C");
JButton flecha=new JButton("<==");
mas.addActionListener(eventos);
menos.addActionListener(eventos);
mult.addActionListener(eventos);
div.addActionListener(eventos);
igual.addActionListener(eventos);
c.addActionListener(eventos);
flecha.addActionListener(eventos);
der.add(mas);
der.add(menos);
der.add(mult);
der.add(div);
der.add(igual);
der.add(c);
der.add(flecha);
medio.add(izq);
medio.add(der);
//Panel abajo
abajo=new JPanel();
principal.add(arriba);
principal.add(medio);
principal.add(abajo);
add(principal);
setVisible(true);
}
public static void main(String[]args){
Calculadora cal=new Calculadora();
}
}
import java.awt.*;
import javax.swing.*;
public class PrimerFrame extends JFrame{
public PrimerFrame(){
super("Titulo de la barra");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{
public ProbarComponentes(){
super("titulo definitivo");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JButton play=new JButton("play");
JButton stop=new JButton("stop");
JLabel jl=new JLabel("Etiqueta",JLabel.RIGHT);
JTextField jt=new JTextField("Escribe",10);
add(play);
add(stop);
add(jl);
add(jt);
setVisible(true);
jt.setText("Pepe");
}
public static void main(String[]args){
ProbarComponentes d=new ProbarComponentes();
}
}
¿Por qué tal cual tengo el codigo de la clase ProbarComponentes al ejecutarla NO me cambia el titulo de la barra?Sé la solución(me la ha dado Cesar anteriormente), pero quisiera saber si la manera en la que lo intento hacer NO tiene sentido y solo hay UNA manera de hacerlo o No..o sea "mi lógica" es que si la clase PrimerFrame es subClase de JFrame, creando un constructor vacio, pero pasandole un String con Super, esto hace que la barra tenga un titulo, así que (aquí es donde viene "mi logica") si creo una subclase(ProbarComponentes) de PrimerFrame y hago lo mismo(o sea, creo un constructor vacio y le paso un String con Super...o creando un constructor pasandole un String también podría ser) para así poner otro titulo en la barra podría funcionar, pero veo que NO me cambia el titulo de la barra.Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.
Abraham Lincoln (1808-1865) Presidente estadounidense.
aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación