imagenes animaciones animacion java swing notifications popup dispose

java - animaciones - Dispose() no funciona en cada fotograma



animacion de imagenes java (2)

Mi programa alertará a los usuarios cuando los datos (nombre de stock y precio) en la base de datos coincidan con los datos (nombre de stock y precio) de Yahoo Finance. Con la ayuda de HarryJoy, puedo implementar una notificación emergente.

El problema ahora es que todas las funciones solo funcionan en el último cuadro (YHOO). No se eliminará () después de 5 segundos o cuando haga clic en CloseButton. ¡Gracias!

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


Como notó Boro, estás reutilizando la misma variable popupFrame para todos tus marcos. Por supuesto, solo puede almacenar un solo cuadro, el último que creó. Todos los demás están perdidos. Así que cuando llamas a popupFrame.dispose (), realmente dispones del último JFrame creado independientemente del botón "X" que presionaste

Pero creo que la opción de hacer tantos fotogramas en realidad no es una buena idea. Debería tener un solo JFrame que contenga un conjunto de JPanel que eliminará después de 5 segundos o cuando se presione el botón ''X''.


Sospecho que el problema que está teniendo es que está pasando, a un código externo (un hilo diferente en este caso), una variable de popUpFrame que luego asigna un nuevo objeto a cada instancia del ciclo.

Este enfoque es susceptible a errores a medida que pierde la referencia que aprobó. Porque lo sobrescribe cada vez que crea un objeto nuevo. Por lo tanto, creo que es posible que solo puedas cerrar el último.

Para evitar algo como esto, una variable que pase a un código externo siempre debe ser final o cuando la creación de instancias de un proceso externo almacene una referencia dentro del código externo.