JOptionPane вызывается дважды из-за метода display () - PullRequest
0 голосов
/ 01 апреля 2019

В настоящее время я изучаю JOGL, и я попытался написать программу, которая позволяет пользователю выбирать, какой тип фигуры он хочет нарисовать в окне.Я уже нашел альтернативное решение, которое заключалось бы в том, чтобы поместить все виды фигур в разные классы, а не только в один.Затем спросите пользователя, какую фигуру добавить в GLJPanel.

Но я все еще хочу понять, почему я столкнулся с этой проблемой и как я могу ее исправить (кроме того, что я описал выше)

Восновной: общие вещи, которые должна делать программа JOGL, println предназначены для отладки.

На дисплее:

-Только «был здесь» в display () печатает дважды в консоли, вероятно, доказывая, что метод отображения фактически вызывается дважды

- я пытаюсь получить значение из JOPtionPane , используя его showInputDialog method.

-Я пытался установить логическое значение ' onetime ', чтобы метод отображения дважды не вызывал JOptionPane , но это не решило проблему

import java.awt.Color;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLJPanel;
import javax.swing.*;

public class Debug {
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {   
                GLProfile p = GLProfile.get(GLProfile.GL2);
                GLCapabilities c = new GLCapabilities(p);
                GLJPanel gljp2 = new GLJPanel(c); //Remplacable par GLCanvas(c);

                gljp2.setSize(800, 800);
                gljp2.setBackground(Color.white);
                System.out.println("SD0");
                Shape shp = new Shape();
                System.out.println("SD1");
                gljp2.addGLEventListener(shp);
                System.out.println("SD2"); 

                do{
                    JFrame fen = new JFrame("Basic Frame");
                    shp.setOnetime(true);
                    fen.getContentPane().add(gljp2);
                    System.out.println("SD3");
                    fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    fen.setSize(800, 800);
                    fen.setVisible(true);
                }while("c".equals(JOptionPane.showInputDialog(null,"Type c to continue")));     
        }});
    }
}

class Shape implements GLEventListener
{
    private static boolean onetime = true;
    private int choice;
    @Override
    public void init(GLAutoDrawable drawable) {
    }

    @Override
    public void display(GLAutoDrawable drawable) 
    {
        System.out.println("Has been here");
        final GL2 gl = drawable.getGL().getGL2();

        if(onetime)
        {
            choice = Integer.parseInt(JOptionPane.showInputDialog(null, "Choice :\n\t1>Line\n\t2>Triangle"));
            onetime=false;
            switch(choice)
            {
                case 1:
                    gl.glBegin(GL2.GL_LINES);
                    gl.glVertex3f(-0.50f, -0.50f, 0);
                    gl.glVertex3f(0.50f, 0.50f, 0);
                    gl.glEnd();
                    break;

                case 2:
                    //drawing the base
                    gl.glBegin(GL2.GL_LINES);
                    gl.glVertex3f(-0.50f, -0.50f, 0);
                    gl.glVertex3f(0.50f, -0.50f, 0);
                    gl.glEnd();

                    //drawing the right edge
                    gl.glBegin(GL2.GL_LINES);
                    gl.glVertex3f(0f, 0.50f, 0);
                    gl.glVertex3f(-0.50f, -0.50f, 0);
                    gl.glEnd();

                    //drawing the lft edge
                    gl.glBegin(GL2.GL_LINES);
                    gl.glVertex3f(0f, 0.50f, 0);
                    gl.glVertex3f(0.50f, -0.50f, 0);
                    gl.glEnd();
                    gl.glFlush();
                    break;

                default:
                    JOptionPane.showMessageDialog(null, "Entrée incorrecte, réessayez");
                    System.exit(1);
            }
        }
    }
//Next is irrelevant (getter and setters) so I havent included it here
}
...