10

Swing アプリケーションで Toast (Android) のような機能を開発しようとしています。スタンドアロンとして、完全に機能します。しかし、アプリケーションに統合すると、問題が発生します。

クラスファイルは次のとおりです。

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

}

いくつかの実装上の欠陥があるかもしれませんが、これは基本的なことです。

これはうまくいきます。しかし、リソースを大量に消費する操作の邪魔にならないようにしようとすると、つまずきます。GIFアニメーションのように表示されていません。これは、一種の失速を意味すると思います。

使用は次のとおりです。

  Toast toast = Toast.showDailog("Generating PDF");

//resource intensive operation. Takes about 3-5seconds to execute

    toast.hide();

さらに残念なことに、「トースト」が破棄された後でも、アプリケーションはひどく遅くなります。「トースト」を廃止すると完全に機能するため、減速は問題の操作によるものではないと確信しています。

誰かがここで何が間違っているか指摘できますか???

私はこの質問をしました。しかし、そこにあるものは、私が探しているものよりもはるかに複雑です. 私が探しているのは、単純なダイアログです。いくつかのコンポーネントを収容する必要がある本格的なフレームではありません。

4

7 に答える 7

0

Java Swing を使用する Toast のような Androidに役立つことを願っています。

于 2013-09-26T11:53:59.157 に答える
0

非表示メソッドをオーバーライドせずに、メソッドを次のようにDialog変更することで問題を解決できると思います。showDialog

public static void showDailog(String textToDisplay){
    final Toast toast = new Toast(textToDisplay);
    // Display the window.
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try{
                toast.setVisible(true);
                Thread.sleep(5000);
                toast.setVisible(false);
                toast.dispose();
            }
            catch(Exception ex){
                ex.printStackTrace();
            }
        }
    });
    thread.start();
}
于 2013-03-28T23:52:14.477 に答える
0

JoptionPaneかもしれませんが、あなたが必要とするものですか?

于 2012-04-15T13:16:14.083 に答える