es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PaintComponent interrumpiendo el dibujo de la cuadrícula.

Soy un traductor de español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy nuevo en Java y en interfaces de usuario, y tengo un problema con Java Graphics. Lo que estoy tratando de lograr es dibujar una cuadrícula en un JPanel y luego pintar componentes personalizados en la cuadrícula.

Aquí está la clase en la que quiero dibujar la cuadrícula (su base se extiende JPanel).

public class RectGridPanel extends GridPanel
{
    List <Rectangle> rects;

    public RectGridPanel(Simulator sim)
    {
        super(sim);
        this.rects = new ArrayList<Rectangle>();      

        this.setLayout(new GridLayout(20,20));

        for(int x = 1; x < 801; x += 40)
        {
            for(int y = 2; y < 801; y += 40)
            {
                Cell newCell = new RectCell(x, y, sim);
                this.add(newCell);
            }
        }
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(Color.BLACK);
        for(int x = 1; x < 801; x += 40)
        {
            for(int y = 2; y < 801; y += 40)
            {
                Rectangle rect = new Rectangle(x, y, 40, 40);
                g2.draw(rect);
                rects.add(rect);
            }
        }
    }
}

Aquí están las celdas que quiero dibujar dentro de la cuadrícula:

public class RectCell extends Cell
{
    Rectangle shape;

    public RectCell(int x, int y, Simulator sim)
    {
        super(x, y, sim);
        shape = new Rectangle(x, y, CELL_SIZE, CELL_SIZE);
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setPaint(Color.BLACK);
        g2.fill(shape);
    }
}

Entonces, la cuadrícula en sí se dibuja bien, pero tan pronto como intento crear celdas dentro de ella, se interrumpe así: enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que los objetos RectCell están siendo añadidos al RectGridPanel usando el FlowLayout por defecto en lugar del GridLayout que fue configurado en el constructor. Para solucionarlo, se puede modificar el constructor de RectGridPanel de la siguiente manera:

    public RectGridPanel(Simulator sim) {
        super(sim);
    
        this.rects = new ArrayList<rectangle>();
    
        this.setLayout(new GridLayout(20, 20));
    
        for (int i = 0; i < (20 * 20); i++) {
            Cell newCell = new RectCell(sim);
            this.add(newCell);
        }
    }
    

    Y modificar el constructor de RectCell de la siguiente manera:

    public RectCell(Simulator sim) {
        super(sim);
        this.setPreferredSize(new Dimension(CELL_SIZE, CELL_SIZE));
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    }
    

    Por defecto, JPanel utiliza el FlowLayout, lo que está causando que las celdas se sobrepongan. Establecer el GridLayout en el constructor asegura que las celdas sean añadidas correctamente en el grid.

    En el constructor de RectCell, se establece un tamaño preferido y un borde para asegurar que cada celda sea visible dentro del grid. El borde también ayuda a separar visualmente las celdas.

    Con estas modificaciones, el grid debería ser mostrado correctamente con celdas dibujadas dentro.

Comments are closed.