簡體   English   中英

Java:無法使用“ localhost:1.0”作為DISPLAY變量的值連接到X11窗口服務器

[英]Java: Can't connect to X11 window server using 'localhost:1.0' as the value of the DISPLAY variable

我創建了一個Web應用程序,該應用程序使用JOptionPane向用戶顯示一些對話框,例如“找不到記錄等”。 我在Windows中進行了此開發,並且一切正常。

然后,我被要求在遠程服務器上部署項目戰,該服務器是沒有任何GUI的RHEL計算機(類似於AWS計算機)。 當我在那運行we應用程序時,無論何時有JOptionPane語句,我都會得到以下提到的異常。

線程“ http-bio-8080-exec-6”中的異常java.lang.InternalError:無法使用“ localhost:1.0”作為DISPLAY變量的值連接到X11窗口服務器。 在sun.awt.X11GraphicsEnvironment.initDisplay(本機方法)在sun.awt.X11GraphicsEnvironment.access $ 200(X11GraphicsEnvironment.java:62)在sun.awt.X11GraphicsEnvironment $ 1.run(X11GraphicsEnvironment.java:178)在java.security.AccessController Java的sun.awt.X11GraphicsEnvironment的.doPrivileged(本機方法).java.lang.Class.forName0的(X11GraphicsEnvironment.java:142)Java的java.lang.Class.forName(Class.java:188)的。 awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)位於sun.swing.SwingUtilities2.isLocalDisplay(SwingUtilities2.java:1393)位於javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:1563)位於javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1599)的.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:147)在javax.swing.UIManager.setLookAndFeel(UIManager.java:530) javax.swing.UIManager.initialize中的javax.swing.UIManager.setLookAndFeel(UIManager.java:570) 位於javax.swing.UIManager.initialize(UIManager.java:1407)處的DefaultLAF(UIManager.java:1320)位於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)

我已經嘗試使用export DISPLAY也嘗試過

System.setProperty("java.awt.headless", "true");
    boolean headless = GraphicsEnvironment.isHeadless();

但是我的問題仍然沒有解決嗎? 有輸入嗎? 我是否應該在Web應用程序中不使用JOptionPane? 如果沒有,那么更好的選擇是什么? JOption的替代者?

您絕對不能在Web應用程序中使用JOptionPane。 classes in Swing. 並且甚至不要考慮在Swing中使用任何其他J 類。

JOptionPane和其他各種Swing組件僅出現在它們運行的​​機器上 因此,即使您能夠克服遇到的異常並以某種方式顯示JOptionPane,JOptionPane也會出現在服務器1上 它不會出現在用戶的瀏覽器中 ,因此用戶不會看到它。

因此,假設此JOptionPane已出現在服務器上。 用戶應該如何閱讀或消除它? 他們只能訪問其瀏覽器。

簡單的答案是他們做不到。

更糟糕的是,JOptionPanes是模態的,因為創建它們的調用要等到對話框關閉后才會返回。 如果用戶輸入的型號編號不存在,則您的Web應用程序可能會掛起,因為在關閉JOptionPane之前無法完成為頁面的投放。 隨着越來越多的用戶使用您的系統,整個Web應用程序最終將陷入停頓,因為越來越多的Web應用程序的工作線程被卡住,等待JOptionPanes被關閉。

相反,您需要以某種方式將錯誤消息發送回瀏覽器。

如果用戶輸入了不存在的型號,我建議將其重定向回輸入該型號的頁面,並在此頁面上顯示一條消息,使用戶清楚他們已被重定向回,因為他們輸入了型號不存在。

您的代碼可能已經在您的計算機上為您工作,但這僅僅是因為您是從與Web服務器運行所在的同一台計算機上瀏覽Web應用程序的。

1 :從技術上講,如果客戶端計算機上有X服務器,並且可以按照Jim Garrison的描述進行設置,則可以向客戶端顯示此JOptionPane,但這絕不是您可以假定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM