Sasapp
tengo un problema con java como entendí no vengo a dibujar figuras geometricas en java, el codigo y los siguientes me pueden ayudar?
Este es el código:
public class Gioco {
public static void main (String args [])
{
PaintRect();
}
public static void PaintRect() {
g.drawRect(100,100,300,300);
g.drawLine(100,100,100,100);
g.setBackground(Color.BLACK);
System.out.println("Trasut");
credits.setText("Kitebbiv");
credits.setBackground(null);
credits.setEditable(false);
credits.setFocusable(false);
credits.setBounds(0,0,100,100);
credits.setForeground(Color.BLACK);
panel.add(credits);
g.getPaint();
}
¿Cómo puedo crear un JFrame
el triangulo, el cuadrado y el rectangulo? corregir mi código gracias
Frakcool
Antes incluso de comenzar a escribir mi respuesta, debo alentarlo a que lea detenidamente: Cómo crear un ejemplo mínimo, completo y verificable válido y un Ejemplo breve, autónomo y correcto.
-
A partir de su código (ahora eliminado), veo que no ha pasado por el Tutorial de Swing sobre pintura personalizada todavía o ni siquiera le prestaste atención, esta línea te traerá problemas
static Graphics2D g = new Graphics2D()
-
El uso excesivo de
static
modificador te hará daño,static
no es una palabra mágica de métodos cruzados para hacer que sus variables sean accesibles en cualquier parte de su programa, en su lugar, debe crear una instancia de su programa y llamar a los métodos desde allí (no son estáticos), consulte ¿Por qué las variables estáticas se consideran malas? , y realmente deberías volver y aprender lo esencial antes de agregar más complejidad a su aprendizaje con una GUI y aún más con la pintura personalizada de Swing. -
estás haciendo uso de
setBounds()
método, que sugiere (y puedo confirmar en su código eliminado) que está utilizando unnull-layout
:panel.setLayout(null);
Realmente deberías considerar revisar el gerentes de diseño
-
Estás haciendo uso de un método obsoleto
JFrame#show()
en su lugar, deberías estar usandoJFrame#setVisible()
método. -
Está configurando manualmente el tamaño de su
JFrame
en su lugar, debe usar un administrador de diseño y llamar al métodoJFrame#pack()
que calculará el tamaño preferido para suJFrame
o anular la de su componentegetPreferredSize()
. -
En su código eliminado, tenía un
MouseListener
unido a unJButton
en su lugar necesitas usar unActionListener
ver Cómo usar Acciones para aprender esto -
No está poniendo su programa en el Subproceso de envío de eventos (EDT) lo que podría hacer que su programa se congele, porque Swing no es seguro para subprocesos. Puede corregir esto escribiendo su
main
método de la siguiente manera:public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { //Your constructor here } }); }
-
Deberías ser más educado: “corregir mi código gracias” suena como una orden, yo hubiera dicho eso como ¿usted me podría ayudar? lo cual suena como una solicitud/petición para que alguien te dé una mano, porque puede, no porque debe ayudarte, todos los puntos anteriores corrigen tu código.
Después de haber dicho todo lo anterior (y que debes leer detenidamente) podemos continuar con la parte de codificación:
Para dibujar un rectángulo necesitamos aprender algo sobre un rectángulo:
- Un rectángulo tiene un ancho y una altura, ambos son diferentes.
- La forma de dibujar un rectángulo en Swing es con
drawRect(x, y, width, height)
draw(Shape)
de ElGraphics2D
método dondeShape
sería un ejemplo deRectangle2D
Para dibujar un cuadrado necesitamos saber que:
- Un cuadrado tiene un ancho y una altura, ambos son del mismo tamaño
- La forma de dibujar un cuadrado en Swing es con
drawRect(x, y, width, height)
draw(Shape)
de ElGraphics2D
método dondeShape
sería un ejemplo deRectangle2D
Debes estar diciendo… “¡Pero el método que estás usando para dibujar el cuadrado es el mismo que el del rectángulo!”pues… si, lo somos, la diferencia es que vamos a pasar un width
y height
igual tamaño para el cuadrado y diferente tamaño para el rectángulo.
Para dibujar un triángulo necesitas saber que:
- Un triangulo tiene 3 lados, pueden ser del mismo o diferente tamano
- No tenemos ningún método para
drawTriangle
en Swing, pero tenemosdrawPolygon(xPoints, yPoints, nPoints)
draw(Shape)
de ElGraphics2D
método, que dibujará un polígono denPoints
(3 en este caso), tomando las coordenadas de cada elemento del arreglo dexPoints
Para elX
coordenadas yyPoints
Para elY
coordenadas y dondeShape
sería un ejemplo dePolygon
Ahora, juntando todo eso, deberíamos tener todo ese código en un método anulado de nuestro JPanel
llamado paintComponent()
como se muestra en el tutorial (Ver punto #1). Debe tener un aspecto como este:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //ALWAYS call this method first!
g.drawRect(10, 10, 50, 50); //Draws square
g.drawRect(10, 75, 100, 50); //Draws rectangle
g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
}
Pero también necesitamos anular otro método. getPreferredSize()
en nuestro JPanel
(ver: ¿Debo evitar el uso de setPreferred|Maximum|MinimumSize en Swing? el consenso general dice que sí), de lo contrario nuestro JFrame
será más pequeño de lo que queremos, por lo que debería verse así:
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
no olvides llamar @Override
en esos métodos!
Con solo esos métodos hemos completado nuestro programa para dibujar las formas, pero sé que si no publico el código completo terminarás escribiendo los métodos anteriores en un lugar que no funcionará o te causará errores de compilación. por lo tanto, el código completo (que de hecho es un MCVE o SSCCE (consulte el primer párrafo de esta respuesta para ver qué significa cada uno)) que produce el siguiente resultado es:
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ShapesDrawing {
private JFrame frame;
private JPanel pane;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ShapesDrawing().createAndShowGui();
}
});
}
public void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
pane = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //ALWAYS call this method first!
g.drawRect(10, 10, 50, 50); //Draws square
g.drawRect(10, 75, 100, 50); //Draws rectangle
g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
g.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
frame.add(pane);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Realmente espero que leas todos los enlaces que publiqué aquí, porque vale la pena.
Y si necesita rellenar las formas, llame fillRect
y fillPolygon
en lugar de drawRect
y drawPolygon
:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //ALWAYS call this method first!
g.drawRect(10, 10, 50, 50); //Draws square
g.fillRect(150, 10, 50, 50); //Fills a square
g.drawRect(10, 75, 100, 50); //Draws rectangle
g.fillRect(150, 70, 100, 50); //Fills a square
g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
g.fillPolygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3); //Fills triangle
g.dispose();
}
Editar
Según el comentario de @MadProgrammer:
¿Podríamos evitar el uso
draw/fillPolygon
a favor de usar la API Shapes actualizada… proporciona mucha más funcionalidad y generalmente es más fácil de usar 😛
Aquí está la actualización paintComponent
método usando la API de Formas:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //ALWAYS call this method first!
Graphics2D g2d = (Graphics2D) g;
g2d.draw(new Rectangle2D.Double(10, 10, 50, 50));
g2d.fill(new Rectangle2D.Double(150, 10, 50, 50));
g2d.draw(new Rectangle2D.Double(10, 75, 100, 50));
g2d.fill(new Rectangle2D.Double(150, 75, 100, 50));
g2d.draw(new Polygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3));
g2d.fill(new Polygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3));
g2d.dispose();
g.dispose();
}
Lo que produce la siguiente salida:
-
¿Podríamos evitar el uso
draw/fillPolygon
a favor de usar la API Shapes actualizada… proporciona mucha más funcionalidad y generalmente es más fácil de usar 😛– Programador loco
30 de enero de 2017 a las 20:48
-
Frakcool Muchas gracias por tomarme el tiempo y hacerme entender cómo crear las diversas formas geométricas.
– Sasap
30 de enero de 2017 a las 22:01
-
@MadProgrammer, vea editar 🙂 y gracias por la sugerencia, usaré la API de Shapes a partir de ahora: D
– Frakcool
30 de enero de 2017 a las 22:02
-
@Sasapp no hay problema, solo asegúrate de aceptar la respuesta
– Frakcool
30 de enero de 2017 a las 22:03
Publicar menos código. Trate de dibujar una figura entonces alguien puede ayudar. Este fragmento es demasiado largo
– efectivo
30 de enero de 2017 a las 17:28
corregir mi código gracias, eso es mucho código. Considere pasar por un problema a la vez. Dibuja el rectángulo, una vez que funcione, intenta dibujar el cuadrado, una vez hecho, dibuja el triángulo. Si se queda con alguno, publique un ejemplo reproducible mínimo para esa parte. Pero de hecho corregiré su código: 1) No use
null-layout
en su lugar usa un administrador de diseño ya que Swing fue diseñado para funcionar con diferentes sistemas operativos, PLAF, tamaños de pantalla y resoluciones, y tampoco llamarsetLocation()
ver El diseño nulo es malo…– Frakcool
30 de enero de 2017 a las 17:32
… y las respuestas en esta pregunta. 2) No llamar
frame.setSize()
en su lugar usapack();
cuando usa un administrador de diseño, 3) Está creando una instancia deGraphics2D
no es así como funciona, consulte el tutorial en Pintura personalizada en Swing. 4) Estás usando demasiadostatic
vea esta pregunta para saber por qué no debe usarlo en este caso.– Frakcool
30 de enero de 2017 a las 17:38
Además, realice el recorrido ya que parece que no lo ha revisado ni el centro de ayuda y también lea Cómo preguntar, una vez hecho, regrese y edite su pregunta para agregar su Ejemplo breve, autónomo y correcto que demuestre su problema y siga las recomendaciones anteriores.
– Frakcool
30 de enero de 2017 a las 17:41
1) “perdón por este código” Edite su pregunta y publique su código allí, no en los comentarios. 2) Sugerencia, agrega @efekctive o a quien quieras notificar en un comentario (El
@
es importante)– Frakcool
30/01/2017 a las 19:30