我已经在这里搜索,但没有得到我的答案(虽然我觉得它应该在这里)。Swing中的旋转轮
我想执行一些活动(但我不知道需要多少时间才能完成),并且在执行此任务时,我想向用户显示一个旋转轮,并显示消息“正在处理”。 ..请稍候”。一旦活动完成,旋转轮也应消失。
如何实现此功能?
我已经在这里搜索,但没有得到我的答案(虽然我觉得它应该在这里)。Swing中的旋转轮
我想执行一些活动(但我不知道需要多少时间才能完成),并且在执行此任务时,我想向用户显示一个旋转轮,并显示消息“正在处理”。 ..请稍候”。一旦活动完成,旋转轮也应消失。
如何实现此功能?
至于我似乎记得,在玻璃面板在Swing可用于:
有人已经实现了这一点:http://www.curious-creature.org/2005/02/15/wait-with-style-in-swing/
有一个在页面顶部的下载链接的源代码。
也要看:http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html
它在一些细节解释了玻璃面板。
+1用于挖掘原始的,这是SwingX中JXBusyLabel的摇篮:-) – kleopatra
很多东西都会归结为你想达到的目标以及你想要的定制和工作量。
您可以加载一个带有ImageIcon
的gif并将其应用于JLabel
以实现您之后的效果。这个例子演示了使用自定义绘画和一个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();
}
}
}
}
为了秋千继续画,你需要创建某种类型的后台线程,直到完成事件分派线程之外执行工作...
例如
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
// Done some work...
}
@Override
protected void done() {
// stop the animation...
}
};
有关详细信息,请Concurrency in Swing更多细节
渲染提示..nice。 :) –
@AndrewThompson虽然有点过分,但它使动画更平滑:P – MadProgrammer
让我们面对它吧。渲染任何东西,除了'直线上升或下降'横向'吸引没有一些渲染提示。 –
并且您阅读[并发中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),其中包括[Worker Threads和SwingWorker](http://docs.oracle.com/) JavaSE的/教程/ uiswing /并发/ worker.html)?? – MadProgrammer
顺便说一句 - 如果你想显示一个动画GIF,请参阅http://www.ajaxload.info/用于生成GIF。 –
是的。谢谢安德鲁 – Kanhaiya