1

我在这里搜索过,但没有得到我的答案(尽管我觉得它应该在这里)。

我想执行一些活动(但我不知道需要多长时间才能完成)并且在运行此任务时,我想向用户显示一个旋转轮,并显示一条消息“处理中...请稍候”。一旦活动完成,旋转的轮子也应该消失。

如何实现这个功能?

4

2 回答 2

3

很多都取决于您想要实现的目标以及您想要进行多少定制和工作。

您可以加载一个 gifImageIcon并将其应用于 aJLabel以实现您所追求的效果。这个例子演示了使用自定义绘画和javax.swing.Timer动画等待周期。

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Waiting {

    public static void main(String[] args) {
        new Waiting();
    }

    public Waiting() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Timer paintTimer;
        private float cycle;
        private boolean invert = false;

        public TestPane() {
            paintTimer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    cycle += 0.05f;
                    if (cycle > 1f) {
                        cycle = 0f;
                        invert = !invert;
                    }
                    repaint();
                }
            });
            paintTimer.setRepeats(true);
            setRuning(true);
        }

        public void setRuning(boolean running) {
            if (running) {
                paintTimer.start();
            } else {
                paintTimer.stop();
            }
        }

        public boolean isRunning() {
            return paintTimer.isRunning();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(40, 40);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (isRunning()) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
                g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
                g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

                int width = getWidth() - 1;
                int height = getHeight() - 1;
                int radius = Math.min(width, height);

                int x = (width - radius) / 2;
                int y = (height - radius) / 2;
                int start = 0;
                int extent = Math.round(cycle * 360f);

                if (invert) {
                    start = extent;
                    extent = 360 - extent;
                }

                g2d.setColor(Color.RED);
                g2d.fill(new Arc2D.Float(x, y, radius, radius, start, extent, Arc2D.PIE));
                g2d.setColor(Color.YELLOW);
                g2d.draw(new Arc2D.Float(x, y, radius, radius, start, extent, Arc2D.PIE));
                g2d.dispose();
            }
        }
    }
}

为了让 Swing 继续绘制,您将需要创建某种后台线程来执行事件调度线程之外的工作,直到您完成...

例如

SwingWorker worker = new SwingWorker() {

    @Override
    protected Object doInBackground() throws Exception {
        // Done some work...
    }

    @Override
    protected void done() {
        // stop the animation...
    }

};

有关更多详细信息,请查看Swing 中的并发以获取更多详细信息

于 2013-07-11T06:27:38.840 回答
3

我似乎记得,Swing 中的 GlassPane 可用于:

  1. 拦截用户输入。
  2. 显示图像/动画

有人已经实现了这个:http ://www.curious-creature.org/2005/02/15/wait-with-style-in-swing/

页面顶部有源代码的下载链接。

另请参阅:http ://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

它更详细地解释了 GlassPane。

于 2013-07-11T06:14:52.683 回答