JOptionPane由于display()方法而被调用两次

时间:2019-03-31 22:13:07

标签: java swing joptionpane

我目前正在学习JOGL,我试图编写一个程序,允许用户选择他要在窗口上绘制的形状类型。我已经找到了另一种解决方案,可以将各种形状放在不同的类中,而不是仅放在一个类中。然后询问用户要添加到GLJPanel中的形状。

但是我仍然想了解为什么会遇到此问题以及如何解决(除了上述问题)

主要: JOGL程序应该执行的一般工作,其中的println是用于调试的。

显示中:

-仅 display()中的“到过这里”在控制台中打印两次,可能证明显示方法被有效地调用了两次

-我尝试使用 showInputDialog 方法从 JOPtionPane 获取值。

-我试图设置一个布尔值' 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
}

0 个答案:

没有答案