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.

Limpiando la pantalla para nuevas gráficas en Java (awt)

Tengo este código que básicamente es un menú principal con dos rectángulos clicables.
– Iniciar juego
– Información

Iniciar juego funciona bien.
La información es lo que no funciona realmente. Cuando se presiona, la pantalla de información aparecerá, pero los botones del menú principal seguirán allí aunque no sean visibles (se pueden hacer clic)… parece que cuando el menú de información está apareciendo, los botones del menú principal no se borran.
Además, cualquier punto en el menú de información es cliclable y mostrará nuevamente el menú principal (no es lo que se pretendía, solo los botones de retroceso deberían hacer eso).

¿Cómo puedo solucionar esos problemas?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay dos problemas descritos:

    1. Los botones del menú principal no se borran cuando aparece el menú de información.
    2. Cualquier punto en el menú de información es seleccionable y mostrará de nuevo el menú principal, no solo los botones de retroceso.

    Para solucionar el primer problema, necesitamos actualizar el método drawMenu(). Actualmente, primero verifica si infoClicked es true. Si es así, llama al método drawInfoMenu() y devuelve al método. De lo contrario, procede a dibujar el menú principal. Sin embargo, no borra ningún componente dibujado previamente. Para solucionarlo, se debe agregar una llamada a g2d.clearRect() para borrar los componentes dibujados previamente antes de dibujar el menú principal. Por ejemplo:

    private void drawMenu(Graphics2D g2d){
    
        if(infoClicked) {
            drawInfoMenu(g2d);
            return;
        } else {
            // limpiar los componentes previamente dibujados
            g2d.clearRect(0, 0, getWidth(), getHeight());
    
            // dibujar el contenedor, texto y botones del menú principal
            drawContainer(g2d);
            drawText(g2d);
            drawButton(g2d);
        }
    
        Toolkit.getDefaultToolkit().sync();
    }
    

    Para solucionar el segundo problema, necesitamos restringir el área seleccionable solo a los botones de retroceso. Actualmente, el método mouseClicked() verifica si el punto del clic del mouse está contenido en el botón de inicio o en el botón de información, y si es así, habilita o muestra la pantalla correspondiente. Para restringir el clic solo al botón de retroceso, podemos agregar una verificación adicional para la bandera infoClicked en el método mouseClicked(), y solo habilitar la pantalla del menú principal cuando esta bandera es true. Por ejemplo:

    @Override
    public void mouseClicked(MouseEvent mouseEvent) {
        Point p = mouseEvent.getPoint();
        if(backButton.contains(p)){
            infoClicked = false;
            backClicked = true;
            repaint();
        } else if (infoClicked && !backButton.contains(p)) {
            // no hacer nada, porque solo queremos que los clics en el botón de retroceso tengan un efecto
        } else {
            owner.enableGameBoard();
        }
    }
    

    Ahora, hacer clic en cualquier lugar que no sea el botón de retroceso en la pantalla de información no tendrá ningún efecto, y solo el botón de retroceso habilitará la pantalla del menú principal.

Comments are closed.