Estoy intentando desarrollar una característica similar a Toast (Android) en mi aplicación Swing. Como independiente, funciona perfectamente. Pero cuando se integra en la aplicación, plantea problemas.Android como Toast en Swing
el archivo de clase es:
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.geom.RoundRectangle2D;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import net.mindcrew.utils.LayoutHelper.Packer;
public class Toast extends JDialog {
String text;
public Toast(String text) {
this.text = text;
initComponents();
}
private void initComponents(){
setLayout(new GridBagLayout());
addComponentListener(new ComponentAdapter() {
// Give the window an rounded rect shape. LOOKS GOOD
// If the window is resized, the shape is recalculated here.
@Override
public void componentResized(ComponentEvent e) {
setShape(new RoundRectangle2D.Double(0,0,getWidth(),getHeight(),50,50));
}
});
setUndecorated(true);
setSize(300,100);
setLocationRelativeTo(null);
getContentPane().setBackground(Color.BLACK);
// Determine what the GraphicsDevice can support.
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
final boolean isTranslucencySupported =
gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT);
//If shaped windows aren't supported, exit.
if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT)) {
System.err.println("Shaped windows are not supported");
}
//If translucent windows aren't supported,
//create an opaque window.
if (!isTranslucencySupported) {
System.out.println(
"Translucency is not supported, creating an opaque window");
}
// Set the window to 70% translucency, if supported.
if (isTranslucencySupported) {
setOpacity(0.9f);
}
ImageIcon loading = new ImageIcon(Toast.class.getResource("/net/mindcrew/utils/userinterface/resources/loading-photo.gif"));
JLabel label = new JLabel(text);
label.setForeground(Color.WHITE);
label.setIcon(loading);
Packer packer = new Packer(this);
packer.pack(label).fillboth().west().inset(0, 50, 0, 20);
}
public static Toast showDailog(String textToDisplay){
final Toast toast = new Toast(textToDisplay);
// Display the window.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
toast.setVisible(true);
}
});
thread.start();
return toast;
}
@Override
public void hide(){
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
setVisible(false);
dispose();
}
});
}
public static void main(String... args){
Toast toast = Toast.showDailog("Display");
try{
Thread.sleep(5000);
}
catch (Exception e){}
toast.hide();
}
}
Puede haber algunos errores de implementación, pero esto es lo básico.
Esto funciona bien. Pero cuando trato de ponerlo en el camino de una operación intensiva en recursos, se dispara. Como en la animación GIF no aparece, lo que creo implica que está estancado.
El uso es:
Toast toast = Toast.showDailog("Generating PDF");
//resource intensive operation. Takes about 3-5seconds to execute
toast.hide();
Para añadir a mi miseria, incluso después de la "tostada" se ha dispuesto, la aplicación se está volviendo terriblemente lento. Estoy bastante seguro de que la ralentización no se debe a la operación en cuestión, ya que está funcionando perfectamente si elimino el "Toast".
¿Alguien puede indicar qué está mal aquí?
Fui a través de this question. Pero las cosas allí son demasiado complicadas de lo que estoy buscando. Lo que estoy buscando es un diálogo simple. No es un cuadro completo que necesita acomodar varios componentes.
* Saludos Binaek Sarkar Fundación HTTC: //www.foundation.....in/* No incluya sigs. o tarjetas de visita en publicaciones. Si la información es importante para usted, colóquela en [su perfil] (http://stackoverflow.com/users/951243/binaek-sarkar). –
¡Uy! Lo recordará la próxima vez. Gracias por señalar. –
Lo eliminé antes de comentar. –