4

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

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

現れる

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

2 に答える 2

5

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

このアプローチでは、渡した参照が失われるため、エラーが発生しやすくなります。新しいオブジェクトを作成するたびに上書きしているためです。したがって、最新のものにしか近づけられない可能性があると思います。

このような事態を避けるために、外部コードに渡す変数は常に、finalまたは外部プロセスをインスタンス化するときに外部コード内に変数への参照を格納する必要があります。

于 2012-05-10T09:27:02.803 に答える
4

Boro が気づいたように、すべてのフレームに同じ popupFrame 変数を再利用しています。もちろん、最後に作成したフレームを 1 つだけ保存できます。他のすべては失われます。したがって、popupFrame.dispose() を呼び出すと、実際には、最後に作成されJFrameたものを、押した "X" ボタンとは無関係に破棄します。

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

于 2012-05-10T09:39:19.320 に答える