Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: andrew522 en 03 de Febrero 2022, 17:10
-
Hola, hice esta figura de robot dibujado en Java. Ya lo tengo terminado, el problema es que tengo muchas líneas, lo cual hace que mi codigo se vea algo feo por asi decirlo. ¿Hay alguna manera de corregir eso?
¡Soy nuevo!
Código:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author ramos
*/
public class Arturito extends JPanel{
@Override
public void paint(Graphics g){
super.paint(g);
g.setColor(new Color(119, 119, 119 ));
g.fillRect(100,600,20,40);
g.fillRect(100,380,20,60);
g.fillRect(180,280,20,340);
g.fillRect(140,440,20,120);
g.fillRect(120,420,60,20);
g.fillRect(120,360,60,20);
g.fillRect(120,620,80,20);
g.fillRect(120,560,20,40);
g.fillRect(200,560,320,20);
g.fillRect(200,340,320,20);
g.fillRect(200,240,20,40);
g.fillRect(220,220,20,20);
g.fillRect(240,200,60,20);
g.fillRect(300,180,120,20);
g.fillRect(420,200,60,20);
g.fillRect(480,220,20,20);
g.fillRect(500,240,20,40);
g.fillRect(520,280,20,340);
g.fillRect(540,420,60,20);
g.fillRect(540,360,60,20);
g.fillRect(600,380,20,60);
g.fillRect(560,440,20,120);
g.fillRect(580,560,20,40);
g.fillRect(600,600,20,40);
g.fillRect(520,620,80,20);
g.fillRect(290,620,180,20);
g.fillRect(290,600,20,20);
g.fillRect(450,600,20,20);
g.fillRect(430,580,20,20);
g.fillRect(310,580,20,20);
g.fillRect(348,220,60,40);
g.fillRect(320,240,40,20);
g.fillRect(380,500,20,20);
g.fillRect(360,520,20,20);
g.setColor(new Color(7, 22, 179 ));
g.fillRect(338,480,23,80);
g.fillRect(400,480,23,80);
g.fillRect(338,480,85,23);
g.fillRect(338,538,85,23);
g.fillRect(338,368,85,23);
g.fillRect(338,400,85,23);
g.fillRect(338,435,23,34);
g.fillRect(400,435,23,34);
g.fillRect(240,220,20,20);
g.fillRect(460,220,20,20);
g.fillRect(460,220,20,20);
g.fillRect(220,240,20,20);
g.fillRect(480,240,20,20);
g.fillRect(220,280,40,20);
g.fillRect(220,320,40,20);
g.fillRect(400,300,60,20);
g.fillRect(300,300,20,40);
g.fillRect(480,300,20,40);
g.fillRect(300,260,120,20);
g.fillRect(320,200,80,20);
g.fillRect(300,220,20,50);
g.fillRect(400,220,20,50);
g.fillRect(400,320,20,20);
g.fillRect(440,320,20,20);
g.setColor(Color.red);
g.fillRect(420,320,20,20);
}
public static void main(String[] args){
JFrame ventana = new JFrame("Arturo");
Arturito objeto = new Arturito();
ventana.add(objeto);
ventana.setSize(700,700);
ventana.setLocationRelativeTo(null);
ventana.setVisible(true);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
-
Hola.
Muy buena la figura :D
Pero creo que no habría forma de reducir el código, ni conseguir darle más elegancia.
Al menos a mí no se me ocurre ninguna.
El propósito de fillRect() no es hacer dibujos "complejos", así que inevitablemente, necesitas decenas y decenas de líneas para hacer una figura tan elaborada.
Un saludo.
-
La forma mas "limpia " de hacer esto es usando un archivo de definicion, que describa las operaciones de dibujo, el programa leeria este archivo y dibujaria lo obtenido, el archivo podria ser un txt con cada operacion de dibujo descrita asi
Operacion: parmetro1 :parametro2 :………parametroN
Ejemplo
fillRect: 25 :25 :50: 50
DrawOval: 0: 0: 100: 100
el codigo usaria java.util.Scanner para leer el archivo linea por linea
Luego con java.util.StringTokenizer puedes separar la linea en partes
asi
StringTokenizer cortador =new StringTokenizer(laLinea,":");
esto dividiria la linea usando ":" como separador
Luego obtienes la operacion, que seria el primer token
String operacion=cortador.nextToken()
luego solo seria pasarla por un if else o switch para identificarla, asi un fillRect tendria otros cuatro tokens(x,y,ancho,alto)
Solo obtenlos de cortador, conviertelos a int con Integer.parseInt y ejecuta la operacion
Algo asi
public void drawFile(Graphics gc,File source){
Scanner scan=new Scanner(source);
while(scan.hashNext()){
String line =scan.nextLine();
StringTokenizer cortador=new StringTokenizer(line,":");
If(cortador.countTokens<2)continue;//linea vacia
String operacion=cortador.nextToken().trim();
if(operacion.equals("fillRect")){
int x=Integer.parseInt(cortador.nextToken().trim());
int y=Integer.parseInt(cortador.nextToken().trim());
int ancho=Integer.parseInt(cortador.nextToken().trim());
int alto=Integer.parseInt(cortador.nextToken().trim());
gc.fillRect(x,y,ancho,alto)
}
}
}
asi, el if llevaria un else if para cada operacion que quieras poder usar(drawRect, fillOvall, etc)