2012-03-22 178 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