Java Dispose()不';我不能在每一帧上工作

Java Dispose()不';我不能在每一帧上工作,java,swing,notifications,popup,dispose,Java,Swing,Notifications,Popup,Dispose,当数据库中的数据(股票名称和价格)与雅虎财经的数据(股票名称和价格)匹配时,我的程序会提醒用户。在的帮助下,我能够实现一个弹出式通知 现在的问题是,所有函数只在最后一帧(YHOO)上工作。5秒后,或单击“关闭”按钮时,它将不会释放()。谢谢 if (stockPriceDB == popStockValue) { String header = "Stock: " + stock.getTicker() + " i

当数据库中的数据(股票名称和价格)与雅虎财经的数据(股票名称和价格)匹配时,我的程序会提醒用户。在的帮助下,我能够实现一个弹出式通知

现在的问题是,所有函数只在最后一帧(YHOO)上工作。5秒后,或单击“关闭”按钮时,它将不会释放()。谢谢

    if (stockPriceDB == popStockValue)
    {                       

        String header = "Stock: "  + stock.getTicker() + " is now @ " +  stock.getPrice();          
        String message = "";

        popUpFrame = new JFrame();
        popUpFrame.setSize(320,90); 
        popUpFrame.setUndecorated(true);                                    
        popUpFrame.getContentPane().setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.weightx = 1.0f;
        constraints.weighty = 1.0f;
        constraints.insets = new Insets(5, 5, 5, 5);
        constraints.fill = GridBagConstraints.BOTH;
        JLabel headingLabel = new JLabel(header);

        ImageIcon headingIcon = new ImageIcon("images/alert.gif");          
        headingLabel.setIcon(headingIcon);          

        popUpFrame.getContentPane().add(headingLabel, constraints);
        constraints.gridx++;
        constraints.weightx = 0f;
        constraints.weighty = 0f;
        constraints.fill = GridBagConstraints.NONE;
        constraints.anchor = GridBagConstraints.NORTH;                          

        closeButton = new JButton(); 

        closeButton = new JButton(new AbstractAction("x") 
        {
        private static final long serialVersionUID = 1L;

        public void actionPerformed(final ActionEvent e) 
            {
                popUpFrame.dispose();
            }
        });

        closeButton.setMargin(new Insets(1, 4, 1, 4));
        closeButton.setFocusable(false);
        popUpFrame.getContentPane().add(closeButton, constraints);
        constraints.gridx = 0;
        constraints.gridy++;
        constraints.weightx = 1.0f;
        constraints.weighty = 1.0f;
        constraints.insets = new Insets(5, 5, 5, 5);
        constraints.fill = GridBagConstraints.BOTH;                 

        JLabel messageLabel = new JLabel(message);  
        popUpFrame.getContentPane().add(messageLabel, constraints);
        popUpFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        popUpFrame.setVisible(true);

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Insets toolHeight = Toolkit.getDefaultToolkit().getScreenInsets(popUpFrame.getGraphicsConfiguration());
        popUpFrame.setLocation(screenSize.width - popUpFrame.getWidth(), screenSize.height - toolHeight.bottom - (popUpFrame.getHeight() * (x+1)));

        new Thread()
        {                           
        public void run() 
            {
                try 
                {
                    Thread.sleep(5000); 
                    popUpFrame.dispose(); 
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
            };

        }.start();
    }
}


我怀疑您遇到的问题是,您正在将
popUpFrame
变量传递给外部代码(在本例中是一个不同的线程),然后将该变量分配给循环的每个实例

这种方法容易出错,因为您正在丢失传递的引用。因为每次创建新对象时都会覆盖它。 因此,我认为您可能只能接近最新的一个


为避免类似情况传递给外部代码的变量应始终为
final
,或者在实例化外部流程时,在外部代码中存储对其的引用

正如Boro所注意到的,您正在为所有帧重用相同的popupFrame变量。当然,它只能存储一个帧,即您创建的最后一个帧。其他的都丢了。因此,当您调用popupFrame.dispose()时,实际上是独立于您按下的“X”按钮来处理上次创建的
JFrame


但我认为,选择制作这么多帧实际上不是一个好主意。您应该拥有一个包含一组JPanel的JFrame,您将在5秒后或按下“X”按钮时删除这些JPanel

谢谢你,波罗!我已经将变量更改为final,现在工作正常了!:)popUpFrame.dispose();应该包装到invokeLater中,因为它被称为EDT的put,rest+1Great可以听到。我想是的:)无论如何,如果只使用一个线程来更新所有可见帧,那么更好的方法就是。这样可以避免为每个帧创建单独的线程。更新线程可以有一个可见的帧列表,这些帧可以有它们的过期时间,它只需每隔30毫秒检查一次它们是否过期,并相应地采取行动。这样,您总是有两个线程。如果你愿意,你也可以在以后重用更新线程,用于动画等。纪尧姆·波莱特,感谢你的推荐和详细解释,我现在明白了:)+1很好,可以重用单个帧,并相应地调整其大小。在这种情况下,有没有办法创建不会共享相同名称的新帧?是的,我同意jpanels可能是你最好的选择,但在尝试移除面板时,同名问题是否仍会出现?@ShaneKelsey个人而言,我会有一个垂直框布局的单框架。在框架内,我将添加一个扩展JPanel的类的实例。然后,该类将创建股票的内容(名称和价格),并包括“X”按钮。然后,从层次结构中删除父面板(并在面板的父面板上调用revalidate())就很简单了。