Crea el cuadrado, rectángulo, triángulo de java en jframe [closed]

9 minutos de lectura

avatar de usuario
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

  • 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 llamar setLocation()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 usa pack(); cuando usa un administrador de diseño, 3) Está creando una instancia de Graphics2D no es así como funciona, consulte el tutorial en Pintura personalizada en Swing. 4) Estás usando demasiado static 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

avatar de usuario
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.


  1. 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() 
    
  2. 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.

  3. estás haciendo uso de setBounds() método, que sugiere (y puedo confirmar en su código eliminado) que está utilizando un null-layout:

    panel.setLayout(null);
    

    Realmente deberías considerar revisar el gerentes de diseño

  4. Estás haciendo uso de un método obsoleto JFrame#show() en su lugar, deberías estar usando JFrame#setVisible() método.

  5. Está configurando manualmente el tamaño de su JFrameen su lugar, debe usar un administrador de diseño y llamar al método JFrame#pack() que calculará el tamaño preferido para su JFrame o anular la de su componente getPreferredSize().

  6. En su código eliminado, tenía un MouseListener unido a un JButtonen su lugar necesitas usar un ActionListenerver Cómo usar Acciones para aprender esto

  7. 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
            }
        });
    }
    
  8. 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:

Para dibujar un cuadrado necesitamos saber que:

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 tenemos drawPolygon(xPoints, yPoints, nPoints) draw(Shape) de El Graphics2D método, que dibujará un polígono de nPoints (3 en este caso), tomando las coordenadas de cada elemento del arreglo de xPoints Para el X coordenadas y yPoints Para el Y coordenadas y donde Shape sería un ejemplo de Polygon

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:

ingrese la descripción de la imagen aquí

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();
}

ingrese la descripción de la imagen aquí


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:

ingrese la descripción de la imagen aquí

  • ¿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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad