2013-07-11 68 views
1

我已经在这里搜索,但没有得到我的答案(虽然我觉得它应该在这里)。Swing中的旋转轮

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

如何实现此功能?

+1

并且您阅读[并发中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),其中包括[Worker Threads和SwingWorker](http://docs.oracle.com/) JavaSE的/教程/ uiswing /并发/ worker.html)?? – MadProgrammer

+1

顺便说一句 - 如果你想显示一个动画GIF,请参阅http://www.ajaxload.info/用于生成GIF。 –

+0

是的。谢谢安德鲁 – Kanhaiya

回答

3

至于我似乎记得,在玻璃面板在Swing可用于:

  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

它在一些细节解释了玻璃面板。

+0

+1用于挖掘原始的,这是SwingX中JXBusyLabel的摇篮:-) – kleopatra

3

很多东西都会归结为你想达到的目标以及你想要的定制和工作量。

您可以加载一个带有ImageIcon的gif并将其应用于JLabel以实现您之后的效果。这个例子演示了使用自定义绘画和一个javax.swing.Timer来动画等待周期。

enter image description here

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

为了秋千继续画,你需要创建某种类型的后台线程,直到完成事件分派线程之外执行工作...

例如

SwingWorker worker = new SwingWorker() { 

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

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

}; 

有关详细信息,请Concurrency in Swing更多细节

+0

渲染提示..nice。 :) –

+0

@AndrewThompson虽然有点过分,但它使动画更平滑:P – MadProgrammer

+0

让我们面对它吧。渲染任何东西,除了'直线上升或下降'横向'吸引没有一些渲染提示。 –