2012-03-22 180 views
0

我正在使用JDialog在我的應用程序的右下角顯示通知。我最多顯示4個通知,最近的通知顯示在最前面。通知根據來自服務器的內容顯示,因此可能只有1個通知或3個,最多4個。這會導致調整JDialog的大小和調整大小以更改JDialog的位置,以便始終在右下角對齊。更改每個新通知收入的位置會導致JDialog閃爍。作爲通知閃爍/閃爍JDialog

下面是代碼,我每次打電話時,新通知來了:

private void updateDialog() 
{ 

    Point p = frame.getLocationOnScreen(); 
    p.x += frame.getWidth()-getWidth()-5; 
    p.y += frame.getHeight()-getHeight()-25; 

    setLocation(p); 
    pack(); 
    repaint(); 
} 

有沒有人有simliar問題?你是如何解決它的?任何其他建議,我應該嘗試做什麼?

+1

郵報SSCCE(http://sscce.org),我們可能會發現你的問題。但它不應該閃爍。 – 2012-03-22 10:36:35

+0

@Guillaume Polet SSCCE今天下降了,對我來說:-),我向他的陛下發送了請求:-) – mKorbel 2012-03-22 10:42:37

+0

@mKorbel我只是試了一遍,這是確定的。還在爲你呢?順便說一句 - *「陛下」*?不,只是「他人,宇宙大師」會沒事的。 ;) – 2012-03-22 11:06:37

回答

3
  • contraproductive是重繪(碼行),刪除,

  • 如果不存在空隙updateDialog(),然後較好將是,否則包()內的另一個代碼行應包into invokeLater();

代碼

private void updateDialog() { 
    setVisible(false); 
    Point p = frame.getLocationOnScreen(); 
    p.x += frame.getWidth() - getWidth() - 5; 
    p.y += frame.getHeight() - getHeight() - 25; 
    setLocation(p); 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      pack(); 
      //repaint(); // useless remove this codeline 
      setVisible(true); 
     } 
    }); 
} 
+0

想知道爲什麼你隱藏然後顯示對話框,並且在setLocation之前不應該發生'pack()'調用,這樣getWidth()和getHeight()將返回由LayoutManager設置的更新值? – 2012-03-22 10:52:22

+0

關於'初始線程'的一切都是關於'pack'和'setVisible'兩個方法的,順便說一句,我已經對am代碼行有了很好的體驗,假設OP'a)'re_use JDialog或'b)'創建一個新的運行時 – mKorbel 2012-03-22 11:03:07

+0

@Guillaume Polet現在我看到你不知道如何使用URL中的評論點擊幫助(左下方的評論窗口),然後複製'「[鏈接](http://example.com )「',這裏顯示的字符'」[鏈接]「'和這裏的網址'」(http://example.com)「' – mKorbel 2012-03-22 11:07:56