2012-05-10 9 views
4

データベース内のデータ(株価&)がYahoo Financeのデータ(株価と価格)と一致すると、私のプログラムはユーザーに警告します。 HarryJoyの助けを借りて、私はポップアップ通知を実装することができます。すべてのフレームでDispose()が機能しません

問題は、すべての機能が最後のフレーム(YHOO)でのみ機能することです。 5秒後に、またはcloseButtonをクリックしても、()を破棄しません。ありがとう!

PopUp

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(); 
    } 
} 

答えて

5

私はあなたが取得している問題は、あなたが外部コード(この場合は別のスレッド)、あなたはすべての新しいオブジェクトを割り当てるpopUpFrameの変数に、渡しているということであると思われますループのインスタンス

この方法では、渡した参照が失われるため、エラーが発生しやすくなります。新しいオブジェクトを作成するたびに上書きするためです。 したがって、あなたは最新のものに近づくことができると思います。外部プロセスストア外部コード内のそれへの参照をインスタンス化するときに、外部コードに渡す変数は常にfinalであるか、または必要がある。このような何かを避けるために

+0

ありがとうございました!私は変数をfinalに変更しましたが、今は正常に動作しています! :) –

+0

popUpFrame.dispose(); EDTのputと呼ばれるので、invokeLaterにラップする必要があります。残りの部分は+1 – mKorbel

+0

これを聞いて嬉しいです。私はそう考えました:)とにかく、あなたが目に見えるすべてのフレームを更新するためにただ1つのスレッドを使用していたとしたら、はるかに良いアプローチになります。こうすることで、フレームごとに個別のスレッドを作成することを避けることができます。更新スレッドは、見えるフレームのリストを有することができ、フレームは満了時間を有する可能性があり、満了したかどうかを確認するだけで30msごとにチェックし、それに応じて動作する。この方法では、常に2つのスレッドがあります。アニメーションなどのために、後でアップデートスレッドを再利用することもできます。 – Boro

4

Boroが気付いたように、すべてのフレームに対して同じpopupFrame変数を再利用しています。もちろん、最後に作成した1つのフレームしか保存することはできません。他のすべては失われています。 popupFrame.dispose()を呼び出すと、実際に最後に作成されたJFrameを「X」ボタンとは別に処分します。

しかし、私は非常に多くのフレームを選択することは実際には良い考えではないと思います。 5秒後または 'X'ボタンを押したときに削除するJPanelのセットを含む単一のJFrameを用意する必要があります。

+0

Guillaume Polet、お勧めと詳細な説明のおかげで、私は今理解しています:) –

+0

+1フレームを再利用し、 – Boro

+0

このような状況で、同じ名前を共有しない新しいフレームを作成する方法はありますか?はい、私はjpanelsがおそらくあなたの最善の策だろうと同意しますが、パネルを削除しようとしたときに同じ名前の問題が存在しますか? –

関連する問題