Foros del Web » Programación para mayores de 30 ;) » Java »

PROBLEMA con dibujar linea

Estas en el tema de PROBLEMA con dibujar linea en el foro de Java en Foros del Web. Hola!! Necesito crear en java un programa que me pida cuantos vectores quiero ingresar y sume sus componentes x e y, para calcular la resultante; ...
  #1 (permalink)  
Antiguo 25/04/2006, 15:40
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
PROBLEMA con dibujar linea

Hola!!

Necesito crear en java un programa que me pida cuantos vectores quiero ingresar y sume sus componentes x e y, para calcular la resultante; graficando todo lo anterior.

El problema es que tengo que hacer un sistema coordenado, el cual habia pensado hacer trazando 2 lineas perpendiculares en el centro de la pantalla. Para dibujar lineas hay que usar el comando drawLine(), con la libreria java.awt.Graphics pero no me funciona.

El codigo mas simple que encontre fue el sgte.:

import java.awt.Graphics;

public class Linea extends java.applet.Applet {

public void paint(Graphics g) {
g.drawLine(25,25,300,150);
}
}

El problema esta en que al declarar la clase tiene herencia con java.applet.Applet pero como esa clase no estaba, la cree y aun asi no funciona, me sigue diciendo al compilar que necesito el main, y yo solo necesito saber como se dibuja una linea :(

Hay alguna forma de dibujar una linea sin tener que hacer un extends a una clase apple, o simplemente hacer que funcione ese codigo??

Si me pudiesen ayudar se los agradeceria mucho.

Chau :)
  #2 (permalink)  
Antiguo 25/04/2006, 22:17
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

En java tienes dos tipos de programas. Unos corren dentro del navegador y son para poner en páginas web. Son applets y la clase principal del programa debe heredar de la clase de java Applet o JApplet. No vale inventarse esta clase, tiene que ser la que viene con java.

El otro tipo de programa es el que corre sin navegador, sin página web y sin nada, como un programa normal de cualquier otro lenguaje, como una aplicación. En estos programas es obligatorio que una clase, la clase principal del programa, tenga un método main() definido así

public static void main (String [] args)
{
...
}

En tu caso, que quieres dibujar, tu clase principal puede heredar de JFrame, que está en javax.swing.JFrame. Debes añadirle el main que haga esto

public class MiClase extends JFrame
{
public static void main (String [] args)
{
MiClase v = new MiClase();
MiClase.pack(); // Hacemos que la ventana tenga un tamaño por defecto.
MiClase.setVisible(true); // Hacemos que la ventana se vea
}
public void paint (Graphics g)
{
super.paint(g); // Dejamos que la ventana se dibuje normalmente
g.drawLine(...); // Dibujamos encima nuestra línea
}
}

Prueba a ver qué tal.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 25/04/2006, 23:47
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Gracias!! pero.. :(

Hola y muchas gracias Chuidiang!!
Pero sigo teniendo problemas :(
Al final lo hice como me aconsejaste de manera que quedo asi:

************************************************** *******
import java.io.*;
import javax.swing.JFrame;

public class MiClase extends JFrame{

public static void main (String [] args){

MiClase v = new MiClase();
MiClase.pack(50, 50, 50, 50); // Hacemos que la ventana tenga un tamaño por defecto.
MiClase.setVisible(true); // Hacemos que la ventana se vea

}

public void paint (Graphics g){

super.paint(g); // Dejamos que la ventana se dibuje normalmente
g.drawLine(20, 20, 20, 20); // Dibujamos encima nuestra línea

}

}
************************************************** ******

Todo esto obviamente guardado en un archivo de nombre MiClase.java; aun asi me tira 3 errores:

-> cannot resolve symbol class Graphics// en la linea del //public void paint (Graphics g)

-> pack() in java.awt.Window cannot be applied to (int,int,int,int)// en la linea del //MiClase.pack(20, 20, 20, 20); ya que supuse que para que la ventana tuviese un tamaño por defecto debia asignarle coordenadas enteras como a la funcion de la linea

-> non-static method setVisible(boolean) cannot be referenced from a static context// en la linea //MiClase.setVisible(true)


Gracias por la ayuda.

Saludos
  #4 (permalink)  
Antiguo 26/04/2006, 06:14
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Para lo de Graphcis, pon import java.awt.*;

Para los otros, es culpa mía. Pon

MiClase v = new MiClase();
v.setSize(50,50); // Hacemos que la ventana tenga un tamaño.
v.setVisible(true); // Hacemos que la ventana se vea

pack() no lleva parámetros, hace que la ventana coja por defecto el tamaño necesario para mostar toda al botoneria que lleva dentro. En tu caso, como no añades botones, es mejor darle un tamaño fijo.
Pon una linea en el drawLine(). Ahora estás dibujando una del punto 20,20 al punto 20,20, que en realidad es un punto y casi no verás nada.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 26/04/2006, 15:59
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Graciasssssssssss

HOLA!!
Creo que me haz solucionado un gran problema, ahora empeze a programar la parte de ingreso de datos pero me falta pensar bien como hago para centrar el sistemas coordenado y dibujar los vectores con su resultante.

Ahora no lo tengo muy claro, pero por ejemplo, si defino el centro del sistema coordenado en (400,300) y si quiero que los vectores siempre se dibujen desde el origen, e ingreso su posicion x almacenandola con ARG1, y luego su posicion en y, con ARG2; para poder dibujarlos podria ser algo como drawLine(0, 0, int ARG1, int ARG2)??

De nuevo, muchas gracias.

Saludos :)
  #6 (permalink)  
Antiguo 26/04/2006, 21:59
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Problema

Hola chuidiang y hola a todos!
Ufff, programe casi todo el dia :( , y aun no puedo lograr unir el programa de calculo de vectores con el de grafico.
Asi me esta quedando:


import java.lang.*;
import java.io.*;
import java.awt.*;
import javax.swing.JFrame;

public class vectores{

//propiedades de la clase vector

BufferedReader stdin; //objeto stdin
int arg1, arg2, arg3, arg4;//argumentos de entrada
int sumai, sumaj;
int argumen1, argumen2, argumen3, argumen4;
boolean error;//demarcador de errores

//Contructor
public vectores(int ar1, int ar2, int arg3, int arg4, boolean e, int argumen1, int argumen2, int argumen3, int argumen4){

stdin = new BufferedReader ( new InputStreamReader(System.in));
arg1=ar1;
arg2=ar2;
arg3=ar3;
arg4=ar4;
error=e;
argumen1=argu1;
argumen2=argu2;
argumen3=argu3;
argumen4=argu4;
}

//validacion de argumentos
public void ingreso() throws IOException {
do{
error=false;
try{
System.out.print("\nIngrese valor para posicion i");
arg1= Int.parseInt(stdin.readLine());

if(arg1>=0)
argumen1=400+arg1;//fijo a que cuadrante pertenece
else
argumen1=400-arg1;//fijo a que cuadrante pertenece

System.out.print("\nIngrese valor para posicion j");
arg2= Int.parseInt(stdin.readLine());

if(arg2>=0)
argumen2=300-arg2;//fijo a que cuadrante pertenece
else
argumen2=300+arg2;//fijo a que cuadrante pertenece

System.out.print("\nIngrese valor para posicion i");
arg3= Int.parseInt(stdin.readLine());

if(arg3>=0)
argumen3=400+arg3;//fijo a que cuadrante pertenece
else
argumen3=400-arg3;//fijo a que cuadrante pertenece

System.out.print("\nIngrese valor para posicion j");
arg4= Int.parseInt(stdin.readLine());

if(arg2>=0)
argumen4=300-arg4;//fijo a que cuadrante pertenece
else
argumen4=300+arg4;//fijo a que cuadrante pertenece

}catch(NumberFormatException e){System.out.print("Error: " + e.getMessage()) ; error=true;}
}while(error);

}

public void suma(){
sumai=0;
sumaj=0;
sumai=argumen1+argumen3;
sumaj=argumen2+argumen4;
System.out.print("\nLas coordenadas del vector resultante son:"+ sumai + sumaj);

}

//************************************************** ****************************
//************************************************** ****************************

public class MiClase extends JFrame{

MiClase v = new MiClase();
v.setSize(800,600); // Hacemos que la ventana tenga un tamaño.
v.setVisible(true); // Hacemos que la ventana se vea

public void paint (Graphics g){

super.paint(g); // Dejamos que la ventana se dibuje normalmente
g.drawLine(100, 300, 700, 300); // Dibujo eje x
g.drawLine(400, 100, 400, 500); // Dibujo eje y
g.drawLine(400, argumen1, 300, argumen2); // Dibujo vector 1
g.drawLine(400, argumen3, 300, argumen4); // Dibujo vector 2
g.drawLine(400, sumai, 300, sumaj); // Dibujo vector resultante

}

}

}


Si me entiendes la idea, el problema esta justamente en que no puedo juntar al programa de dibujo de vetores con el principal y estos deben correr juntos, es decir, que en el fondo el prorama de dibujo de vectore sea un metodo al que mando a llamar y le paso los parametros de argumentos..
OJO!! que mi ultima solucion fue sacarle el main para ponerlo en otra clase de donde mando a llamar todo, pero aun asi no funciono.

Gracias por toda la ayuda prestada, y disculpa, pero si me pudieras ayudar nuevamente, te lo agradeceria mucho.

Saludos

Bye
  #7 (permalink)  
Antiguo 26/04/2006, 22:01
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Lo que dices es correcto. El problema es que la 0,0 está en la esquina superior izquierda de la pantalla. Todos los vectores te saldrán de allí.

Si quieres centrarlos, coge tu centro de pantalla, que según lo que pones será 200,150 y súmale estos valores a todas las coordenadas

drawLine(0+200, 0+150, ARG1+200, int ARG2+150);

Así saldrán del centro del dibujo.

Tienes un segundo problema adicional. La coordenadas y positivas en el gráfico van hacia abajo. Es decir, la y=0 es arriba y la y=300 es abajo. Para que te quede bien, debes restar todas las coordenadas y de 300

drawLine(0+200, 300-(0+150), ARG1+200, 300-(ARG2+150));

Lo mejor es que en algún sitio te hagas tu propio método dibujaLinea (x1,y1,x2,y2) y dentro hagas esta "traducción". De esta forma sólo haces este código una vez el resto del código queda más limpio y claro.

Listo.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 26/04/2006, 22:02
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola de nuevo.

Si quieres algo más avanzado, puedes usar la clase AffineTransform. En http://www.chuidiang.com/java/graficos/seno/seno.html tienes un pequeño tutorial de cómo se hace.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 26/04/2006, 22:12
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
mmmmm

Gracias!!
Pero me captaste en el ultimo POST..
En el fondo, como puedo hacer que la clase MiClase, que es la que dibuja, sea un metodo al que yo mande a llamar entregandole parametros para el dibujo??
Porque le saque el main y no funciono... como lo dejo como un metodo independiente, al que mando a llamar de una funcion principal, si te fijas, esta en el ultimo codigo que puse, al final.

Gracias otra vez :)

Salu2
  #10 (permalink)  
Antiguo 26/04/2006, 22:25
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Hay muchas formas de hacerlo.

En MiClase con el JFrame debes dejar el main(). Tiene obligatoriamente que haber un main() en algún sitios, si no, no puedes ejecutar.

A la clase vector ponle un método dibuja(Graphcis g) que dibuje con el graphics que le pasan.

En MiClase, en el main(), haz un new de vectores y guárdalo como atributo de la clase.

En MiClase, en el método paint(), llama a super(g) como haces ahora y luego llama a vector.dibuja(g);

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #11 (permalink)  
Antiguo 27/04/2006, 16:10
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Pequeño error

Gracias chuidiang!!
Ahora solo me queda un pequeño error.
El programa vectores.java sufrio la pequeña modificacion que me aconsejaste quedando asi ->

----------------------------------------------------------------------------------------------------------------------------------------------------
import java.lang.*;
import java.io.*;
import java.awt.*;
import javax.swing.JFrame;

public class vectores{

//propiedades de la clase vector

BufferedReader stdin; //objeto stdin
int arg1, arg2, arg3, arg4;//argumentos de entrada
int sumai, sumaj;
int argumen1, argumen2, argumen3, argumen4;
boolean error;//demarcador de errores

//Contructor
public vectores(int ar1, int ar2, int ar3, int ar4, boolean e){

stdin = new BufferedReader ( new InputStreamReader(System.in));
arg1=ar1;
arg2=ar2;
arg3=ar3;
arg4=ar4;
error=e;

}

//validacion de argumentos
public void ingreso() throws IOException {
do{
error=false;
try{

System.out.print("\nIngrese valor para posicion i ");
arg1= Integer.parseInt(stdin.readLine());


if(arg1>=0)
argumen1=400+arg1;
else
argumen1=400-arg1;


System.out.print("\nIngrese valor para posicion j ");
arg2= Integer.parseInt(stdin.readLine());


if(arg2>=0)
argumen2=300-arg2;
else
argumen2=300+arg2;


System.out.print("\nIngrese valor para posicion i ");
arg3= Integer.parseInt(stdin.readLine());


if(arg3>=0)
argumen3=400+arg3;
else
argumen3=400-arg3;


System.out.print("\nIngrese valor para posicion j ");
arg4= Integer.parseInt(stdin.readLine());


if(arg2>=0)
argumen4=300-arg4;
else
argumen4=300+arg4;


}catch(NumberFormatException e){System.out.print("Error: " + e.getMessage()) ; error=true;}
}while(error);

}

public void suma(){
sumai=0;
sumaj=0;
sumai=argumen1+argumen3;
sumaj=argumen2+argumen4;
System.out.print("\nLas coordenadas del vector resultante son: "+ sumai + "y" + sumaj);

}

public void dibuja(Graphics g){
g.drawLine(100, 300, 700, 300); // Dibujo eje x
g.drawLine(400, 100, 400, 500); // Dibujo eje y
g.drawLine(400, argumen1, 300, argumen2); // Dibujo vector 1
g.drawLine(400, argumen3, 300, argumen4); // Dibujo vector 2
g.drawLine(400, sumai, 300, sumaj); // Dibujo vector resultante
}

}

----------------------------------------------------------------------------------------------------------------------------------------------------

El cual me corre sin ningun problema; el problemilla esta en MiClase.java, el cual ahora esta asi ->

import java.io.*;
import java.awt.*;
import javax.swing.JFrame;


public class MiClase extends JFrame{

public static void main (String [] args) throws IOException {


vectores mismetodos = new vectores (0, 0, 0, 0, false);
mismetodos.ingreso();
mismetodos.suma();
paint(g);

MiClase v = new MiClase();
v.setSize(800,600); // Hacemos que la ventana tenga un tamaño.
v.setVisible(true); // Hacemos que la ventana se vea
}

public void paint (Graphics g){

super.paint(g); // Dejamos que la ventana se dibuje normalmente
vectores Mivector = new vectores(0, 0, 0, 0, false); // Instanciamos la clase vectores
Mivector.dibuja(g); // Mando a llamar al metodo dibuja(g)

} // Fin paint()

}

----------------------------------------------------------------------------------------------------------------------------------------------------


El problema esta en que yo en el main mando a llamar a todos los metodos en la primera parte ->
--------------------------------------------------------------------------
public static void main (String [] args) throws IOException {

vectores mismetodos = new vectores (0, 0, 0, 0, false);
mismetodos.ingreso();
mismetodos.suma();
paint(g);
--------------------------------------------------------------------------

Pero cuando intento llamar al metodo paint (g), el cual a su vez manda a llamar al metodo dibuja(g), me tira el siguiente error -> cannot resolve symbol variable g, y es necesario llamara al metodo paint ya que ese el el metodo que dibuja en el fondo con los parametros que ingresa el usuario.

Si nuevamente me pudieses ayudar, estaria muy agradecido.
Muchas gracias por tu apoyo otra vez.

Saludos

Adios :)
  #12 (permalink)  
Antiguo 27/04/2006, 22:08
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

A los métodos paint() no debes llamarlos tú. Los llama java cuando la ventana se muestra o es necesario repintarla. Si quieres probar un repintado, llama al método repaint(), que no lleva parámetros. De todas formas, no es necesario donde lo has puesto porque al hacer setVisible(true), java llamará al paint().

Estás haciendo dos new de vectores, que supongo que no es eso lo que quieres.

Declara vectores como un atributo static de MiClase. En el main haces el new como lo tienes ahora, pero quitando la declaración. En el método paint() de MiClase nohagas el new, sólo llama a dibuja(g)


Código PHP:
public class MiClase
{
   static 
vectores mismetodos;
   public static 
void main (String [] args)
   {
      ...
      
mismetodos = new vectores (...);
      
mismetodos.ingreso();
      
mismetodos.suma();
      ...
   }
   public 
void paint (Graphics g)
   {
      
super.paint(g);
      
mismetodos.dibuja(g);
   } 
Se bueno
__________________
Apuntes Java
Wiki de Programación
  #13 (permalink)  
Antiguo 28/04/2006, 19:34
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Ahora si!!

Hola!
Todo funcionando super bien, algunos problemitas con los graficos pero ya defini mi sistema de coordenadas como me aconsejaste :)
Ahora tengo una pregunta; como puedo hacer para que en la ventana de dibujo tenga un titulo arriba.. intuitivamente intente con un System.out.print, pero sabria que no resultaria xD mas vale intentarlo.
Y para variar encontre un aplet para aplicar color a las lineas y me gustaria saber como puedo aplicar color sin un aplet, ya que no necesito correr el programa en internet.
El programa principal al final quedo con los cambios que me diste y quedo OK!

Gracias por todo.

Saludos

Bye
  #14 (permalink)  
Antiguo 28/04/2006, 19:45
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
La clase JFrame tiene un metodo llamado setTitle(String titulo), lo llamas y le pasas como parametro el nombre que quieres en el titulo y listo.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #15 (permalink)  
Antiguo 28/04/2006, 23:47
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Duda...

Gracias chuidiang y TolaWare!!
Lo del titulo en la ventana me funciono perfectamente, pero no asi el metodo setBackground(java.awt.Color.white), como podria hacerlo funcionar??¿¿
Muchas gracias TolaWare por darme el plus del titulo en la ventana, pero lo que realmente quiero es poner texto en la ventana, es decir, dentro de ella, para darle otro plus a mi aplicacion. Lo que pasa es que estoy dibujando un sistema coordenado con vectores y ya que no pude hacer las flechitas en los extremos, me gustaria poder escribir cual es el eje de las x y cual es el de las y; ademas de algun tipo de leyenda dentro de la ventana. Estuve investigando en internet y solo encontre un metodo que me funciono, el cual es para transformar la flecha en una manito al pasar por sobre la ventana.
En el fondo me gustaria hacer funcionar el metodo para cambiar el color de fondo de la ventana y tambien poder escribir dentro de ella como ya detalle anteriormente.

Si me pudiesen ayudar seria genial, aqui les envio el main ->

************************************************** *******
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.JFrame;


public class MiClase extends JFrame{

static vectoresM mismetodos;

public static void main (String [] args) throws IOException {


mismetodos = new vectoresM (0, 0, false);
mismetodos.ingreso();
mismetodos.muestra();
mismetodos.acumulador();



MiClase v = new MiClase();

v.setTitle("***** SUMA DE VECTORES & CALCULO DE RESULTANTE *****");

v.setBackground(java.awt.Color.white);

v.setCursor(new Cursor(Cursor.HAND_CURSOR));

v.setSize(800,600); // Hacemos que la ventana tenga un tamaño.
v.setVisible(true); // Hacemos que la ventana se vea


}

public void paint (Graphics g){

super.paint(g); // Dejamos que la ventana se dibuje normalmente

mismetodos.dibuja(g); // Mando a llamar al metodo dibuja(g)

} // Fin paint()

}

************************************************** *******
Gracias!!

Saludos
  #16 (permalink)  
Antiguo 29/04/2006, 00:09
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Para colores, en el método paint pon

g.setColor (Color.red);

A partir de ese momento, lo que dibujes con ese Graphics se pintará rojo. Vete cambiando los colores según necesitas.

Con g.drawString (...) puedes dibujar texto en la posición que quieras.

Para rellenar de blanco, prueba con esto

setOpaque(true);
setBackground (Color.white);

si no funciona, la forma fácil de no liarse es, en el método paint(), después de llamar a super.paint(g) y antes de ponerse a dibujar, pintar un rectangulo relleno de color

public void paint (Graphics g)
{
super.paint(g);
g.setColor (Color.white);
g.fillRect (0,0,getWidth(), getHeight());
g.setColor (Color.black); // Elige el color que quieras para dibujar
...
}

En http://java.sun.com/j2se/1.5.0/docs/.../Graphics.html tienes todos los métodos de la clase Graphics, donde pordrás ver los detalles de drawString() y ver qué otros métodos tiene que te resulten de interes.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #17 (permalink)  
Antiguo 29/04/2006, 14:37
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Graciasssssssssssss!!

Muchas gracias por todo!!

Saludos
  #18 (permalink)  
Antiguo 30/04/2006, 12:55
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
plus¿¿??

Hola!!
Espero que se encuentren super.
Ya termine el programa, pero lo estoy optimizando un poquito mas. El asunto es que me gustaria que en la ventana donde se dibuja el grafico aparecieran dos botones, uno para salir del programa y otro para que se reiniciara, ademas de cuales son los comandos para ello. Intente con un pack() para dar espacio a los botones, pero no resulto, si me pudiesen ayudar seria super :)
Gracias nuevamente.

Saludos

Adios
  #19 (permalink)  
Antiguo 30/04/2006, 13:50
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Para eso no te queda más remedio que rehacerlo todo un poco.

Estás usando el JFrame para dibujar. Si le añades botones, dibujarás encima de ellos, salvo que te preocupes de respetar sus coordenadas y la zona que ocupan.

Lo mejor es que cambies la herencia de tu clase para que en vez de heredar de JFrame herede de Canvas.

Hazte otra clase que herede de JPanel, ponle un FlowLayout y mete los dos botones.

Ahora, otra clase con el main(). Copia el main que tenías a esta clase y borralo de lo que ahora es el Canvas. En ese main(), además de lo que ya haces, debes "contruir" la ventana. Puede ser como esto

JFrame v = new JFrame();
MiCanvas c = new MiCanvas();
MiPanelBotones b = new MiPanelBotones();
v.getContentPane().add(c,BorderLayout.CENTER);
v.getContentPane().add(b.BorderLayout.SOUTH);
v.pack();

v.setVisible(true);

Por supuesto, tendrás que arreglarlo todo un poco para que te siga compilando.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #20 (permalink)  
Antiguo 13/05/2006, 00:15
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Hola!!

Hola chuidiang!!
Sabes, el programa quedo excelente asi que muchas gracias.
Ahora estoy aciendo un programa similar y tengo un problema al dibujar una linea y darle los parametros.
Lo siguiente es parte del programa ->


if(P+3==2*K){
for(i=1;i<=K;i++){
System.out.print("\nIngrese valor para posicion x del nudo " + i + ": ");
arg1 = Integer.parseInt(stdin.readLine());


argumen1=400+arg1;
MATRIZN[i][1]=argumen1;


System.out.print("\nIngrese valor para posicion y del nudo " + i + ": ");
arg2 = Integer.parseInt(stdin.readLine());

argumen2=300-arg2;
MATRIZN[i][2]=argumen2;

}


public void dibuja(Graphics g){

g.drawLine(100, 300, 700, 300);//Dibujo eje x

int B=109;
for(i=0;i<59;i++){
g.drawString("|",B,304);
B=B+10;

}

g.drawLine(400, 100, 400, 500);//Dibujo eje y

B=114;
for(i=0;i<39;i++){
g.drawString("-",399,B);
B=B+10;

}


for(i=1;i<=K;i++){
g.setColor(Color.blue);
g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i++][1], MATRIZN[i++][2]);
}

}
}


En la linea con negrita esta el problema ya que necesito que se dibuje una linea a continuacion de otra.

El programa pide por ejemplo coordenadas, entonces si ingreso 30,30 luego ingreso 100,30 y finalmente 100,0 necesito que entre todas esas coordenadas se dibujen lineas, pero si te das cuenta van de 2 en 2, y para dibujar lineas se necesitan al menos 4.
Ya probe de las siguientes formas ->

g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i++][1], MATRIZN[i++][2]);, pero solo me dibuja un punto y si pruebo con ->

g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[K][1], MATRIZN[K][2]);, me dibuja las ultimas 2 lineas, no dibujando la linea que tiene que ir desde 30,30 al 100,30.

Si me pueden ayudar seria espectacular.

Muchas Gracias.

Saludos
  #21 (permalink)  
Antiguo 13/05/2006, 16:26
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:
La primera opción no va porque incrementas i dos veces (una en cada indice del array) y una tercera vez en el bucle, por lo que el primer punto es el primer punto, pero luego los i++ en los indices hacen cosas raras (ahora no te lo puedo asegurar, pero creo que coge el primer punto otra vez y luego se incrementa dos veces la i, con lo que te sales del bucle y sólo pinta un punto en la primera posición, que es lo que dices que te está pasando).
La segunda estás usando el punto final, así que te saldrán dos rayas, el primer punto con el último y el segundo con el último.

Haz algo así

for (i=1;i<=k;i++)
{
g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i+1][1], MATRIZN[i+1][2]);
}

Eso sí, revisa los límites del bucle para no salirte.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #22 (permalink)  
Antiguo 13/05/2006, 20:21
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Problema

Gracias por la respuesta pero no funciono ya que dibuja la primera linea y la que sigue la tira al infinito.
El problema esta justamente en las i+1 creo, pero no se que hacer porque los parametros para dibujar una linea deben ser x1,y1,x2,y2.. por lo tanto deben ir los ultimos MATRIZN[][], pero deben incrementarse de alguna forma o solo se dibujara un punto, te envio el codigo completo para que lo aprecies mejor.

--------------------------------------------------------------------------

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.JFrame;

public class mnudos{

//Propiedades de la clase mnudos

BufferedReader stdin; //Objeto stdin
int arg1, arg2;//Argumentos de entrada
int K, P, i;//Variables
int argumen1, argumen2;
boolean error;//Demarcador de errores
int [][] MATRIZN = new int[50][50];

//Contructor
public mnudos(int ar1, int ar2, boolean e){

stdin = new BufferedReader ( new InputStreamReader(System.in));
arg1=ar1;
arg2=ar2;
error=e;

}

//Validacion de argumentos
public void ingreso() throws IOException {
do{
error=false;
try{
System.out.println("****************************** ***********************************************");
System.out.println("*************************** METODO DE LOS NUDOS ****************************");
System.out.println("****************************** ***********************************************");
System.out.println("\n");
System.out.print("Ingrese el numero de nudos: ");
K = Integer.parseInt(stdin.readLine());
System.out.println("");
System.out.print("Ingrese el numero de barras: ");
P = Integer.parseInt(stdin.readLine());
System.out.println("");

//************************************************** ******************************
//************************************************** ******************************

if(P+3==2*K){
for(i=1;i<=K;i++){
System.out.print("\nIngrese valor para posicion x del nudo " + i + ": ");
arg1 = Integer.parseInt(stdin.readLine());


argumen1=400+arg1;
MATRIZN[i][1]=argumen1;


System.out.print("\nIngrese valor para posicion y del nudo " + i + ": ");
arg2 = Integer.parseInt(stdin.readLine());

argumen2=300-arg2;
MATRIZN[i][2]=argumen2;

}

}

}catch(NumberFormatException e){System.out.println("\nError!! Solo numeros enteros, intente nuevamente..") ;
System.out.println("");
System.out.println("");
error=true;}
}while(error);

}

//************************************************** ******************************
//************************************************** ******************************

public void muestra(){
System.out.println("");
System.out.println("\n\tLas coordenadas de los nudos ingresados son: ");
for(i=1;i<=K;i++){
System.out.println("");
System.out.println("");
System.out.print("\t\tNudo n_" + i + " "+(MATRIZN[i][1]-400)+ "," +((MATRIZN[i][2]-300)*(-1)));
//System.out.println("");
//System.out.println("");
}

}

//************************************************** ******************************
//************************************************** ******************************


public void dibuja(Graphics g){

g.drawLine(100, 300, 700, 300);//Dibujo eje x

int B=109;
for(i=0;i<59;i++){
g.drawString("|",B,304);
B=B+10;

}

g.drawLine(400, 100, 400, 500);//Dibujo eje y

B=114;
for(i=0;i<39;i++){
g.drawString("-",399,B);
B=B+10;

}


for(i=1;i<=K;i++){
g.setColor(Color.blue);
g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i+1][1], MATRIZN[i+1][2]);
}

}
}

//************************************************** ****************************

MAIN->
-----------

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.JFrame;


public class mainnudos extends JFrame{

static mnudos mismetodos;

public static void main (String [] args) throws IOException {


mismetodos = new mnudos (0, 0, false);
mismetodos.ingreso();
mismetodos.muestra();


mainnudos v = new mainnudos();

v.setTitle("***** METODO DE LOS NUDOS *****");

v.setCursor(new Cursor(Cursor.HAND_CURSOR));

v.setSize(800,600);//Hacemos que la ventana tenga un tamaño
v.setVisible(true);//Hacemos que la ventana se vea


}

public void paint (Graphics g){

super.paint(g);//Dejamos que la ventana se dibuje normalmente

g.setColor (Color.white);
g.fillRect ( 0, 0, 800, 600);
g.setColor (Color.black);//Elige el color para dibujar

mismetodos.dibuja(g);//Mando a llamar al metodo dibuja(g)

}

}


-------------------------------------------------------------------------


Me he cabeceado toda la tarde pero no logro obtener la solucion uff.
Este "metodo de los nudos" debe cumplir la condicion inicial que sale al principio P+3==2*K, siendo K el numero de nudos y P el numero de barras, por lo que si ingresas 3 nudos y 3 barras, y luego como coordenadas de nudos (30,30) ; (100,30) y (100,0) debe dibujarse un triangulo, con un drawline que debe ser (30,30,100,30) luego (100,30,100,0) y finalmente (100,0,30,30) me captas?

Muchas gracias por la ayuda.

Saludos

Última edición por cocke; 13/05/2006 a las 20:28
  #23 (permalink)  
Antiguo 13/05/2006, 21:28
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Entiendo por lo que cuentas que K vale 3 y que las posiciones buenas de MATRIZ son MATRIZ[1] a MATRIZ[3], incluidos ambos valores.

Te dije que verificaras que no te sales del bucle, cosa que no has hecho, por ello el último valor de i+1 se sale de rango.

Si además quieres que el último vuelva a unirse con el primero, el código cambia un poco. No se puede hacer además de forma más sencilla por empezar los indices en 1 y no en 0.

Tienes que dejar el código como te lo he puesto, pero dentro del for y antes de pintar la linea, comprueba si i==k y en ese caso, pinta desde el punto i al punto 1.

Si los indices hubieran empezado desde cero, te podrías ahorrar el if con un pintar un punto desde i hasta (i+1)%K

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #24 (permalink)  
Antiguo 13/05/2006, 22:21
 
Fecha de Ingreso: abril-2006
Mensajes: 22
Antigüedad: 18 años
Puntos: 0
Lo se

Hola!!
Gracias por tu respuesta.
La verdad es que se que se sale del bucle, lo que nose es como solucionar eso.

Deje el codigo como tu me dijiste, pero me sigue dibujando lo mismo.
Supongo que al decir que "pintara de i a 1" te refieres a que al comprobar que i termino siendo i==K dibuje la linea final de i a 1.
El problema es que lo hago pero quedo en la misma.

De verdad gracias por tomarte un tiempo para responderme, pero soy principiante en java y ademas un poco cabeza dura :)

Por lo que pude captar era algo asi ??¿¿ ->

for (i=1;i<=K;i++){

g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i+1][1], MATRIZN[i+1][2]); //asi dejaste el codigo en el post de arriba

if(i==K){
g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[1][1], MATRIZN[1][2]);
}
}

Gracias por enfocarme.

Saludos
  #25 (permalink)  
Antiguo 14/05/2006, 08:43
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Tienes que comprobar si i==k antes de pintar

if (i==k)
g.drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i+1][1], MATRIZN[i+1][2]);
else
drawLine(MATRIZN[i][1], MATRIZN[i][2], MATRIZN[i+1][1], MATRIZN[i+1][2]);

Se bueno.
__________________
Apuntes Java
Wiki de Programación
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:08.