我创建了一个Web应用程序,它利用JOptionPane向用户显示一些对话框,例如' Record not found etc'。我在Windows中进行了这项开发,一切正常。
然后我被要求在远程服务器上部署项目战争,这是一台没有任何GUI的RHEL机器(类似于AWS机器)。当我在那里运行我的应用程序时,无论何处有JOptionPane语句,我都会得到以下提到的异常。
线程中的异常" http-bio-8080-exec-6" java.lang.InternalError:无法使用' localhost:1.0'连接到X11窗口服务器作为DISPLAY变量的值。 at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at sun.awt.X11GraphicsEnvironment.access $ 200(X11GraphicsEnvironment.java:62) at sun.awt.X11GraphicsEnvironment $ 1.run(X11GraphicsEnvironment.java:178) at java.security.AccessController.doPrivileged(Native Method) 在sun.awt.X11GraphicsEnvironment。(X11GraphicsEnvironment.java:142) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:188) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82) at sun.swing.SwingUtilities2.isLocalDisplay(SwingUtilities2.java:1393) 在javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:1563) 在javax.swing.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:147) 在javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1599) 在javax.swing.UIManager.setLookAndFeel(UIManager.java:530) 在javax.swing.UIManager.setLookAndFeel(UIManager.java:570) 在javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1320) 在javax.swing.UIManager.initialize(UIManager.java:1407) 在javax.swing.UIManager.maybeInitialize(UIManager.java:1395) 在javax.swing.UIManager.getDefaults(UIManager.java:644) 在javax.swing.UIManager.getString(UIManager.java:790) 在javax.swing.UIManager.getString(UIManager.java:807) 在javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:610)
我已经尝试过使用导出DISPLAY也试过
System.setProperty("java.awt.headless", "true");
boolean headless = GraphicsEnvironment.isHeadless();
但我的问题仍未解决?有什么投入?我不应该在Web应用程序中使用JOptionPane吗?如果不是那么什么是更好的选择? JOption的替代?
答案 0 :(得分:0)
您绝对不能在Web应用程序中使用JOptionPane。并且甚至不考虑使用Swing中的任何其他J Whatever 类。
JOptionPane和其他各种Swing组件仅在上运行的计算机上显示。因此,即使您可以通过您遇到的异常,并以某种方式显示JOptionPane,JOptionPane也会出现在服务器 1 上。 它不会出现在用户的浏览器中,因此用户无法看到它。
所以,假设这个JOptionPane出现在服务器上。用户应该如何阅读或解雇它?他们可以访问的只是他们的浏览器。
简单的答案是他们不能。
更糟糕的是,JOptionPanes是模态的,因为创建它们的调用在对话框被解除之前不会返回。如果用户输入了不存在的型号,则您的Web应用程序似乎会挂起,因为在JOptionPane被解除之前无法完成页面的服务。随着更多用户使用您的系统,随着越来越多的Web应用程序工作线程等待JOptionPanes被解雇,整个应用程序最终会停止运行。
相反,您需要以某种方式将错误消息发送回浏览器。
如果用户输入了不存在的型号,我建议您重新定向到输入型号的页面,并在此页面上显示一条消息,告知用户他们被重定向回来,因为他们输入了一个不存在的型号。
您的代码可能在您的计算机上为您工作,但这只是因为您正在从运行Web服务器的同一台计算机上浏览您的Web应用程序。
1 :从技术上讲,如果客户端计算机上有X服务器并且可以像Jim Garrison所描述的那样设置它,那么你可以将这个JOptionPane显示给客户端,但这肯定不是你能做的事情。假设