作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 LayerUI 的自定义子类创建了一个加载的小指示。
list是StringWorker子类的arraylist。它的 get 方法是一个阻塞调用,所以我认为这就是问题所在,只是不知道如何修复它。该层启动一个计时器,据我所知,计时器在自己的线程中执行,因此阻塞 get 不应干扰。
loadingLayer.setVisible(true);
lockComponents();
for(int i = 0; i < list.size(); i++) {
try {
System.out.println("About to check "+i);
if(list.get(i).get() == null) {
}
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (ExecutionException e1) {
e1.printStackTrace();
}
}
unlockComponents();
loadingLayer.setVisible(false);
“loadingLayer”仅在所有这些代码完成后才会出现。
LoadingLayerUI 类:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.Timer;
import javax.swing.plaf.LayerUI;
public class LoadingLayerUI extends LayerUI<JComponent> implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 827885062549399916L;
private boolean isShowing;
private Timer timer;
private String text;
@Override
public void paint(Graphics g, JComponent jc) {
super.paint(g, jc);
if(!isShowing)
return;
Graphics2D g2 = (Graphics2D) g.create();
int w = jc.getWidth();
int h = jc.getHeight();
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, .7f));
g2.setPaint(Color.LIGHT_GRAY);
g2.fillRect(0, 0, w, h);
g2.setColor(Color.BLACK);
Font font = new Font("Sans-Serif",Font.BOLD, 20);
int width = g2.getFontMetrics(font).stringWidth("Loading");
g2.setFont(font);
if(text != null)
g2.drawString(text, (w-width)/2, h/2);
g2.dispose();
jc.repaint();
}
public void setVisible(boolean set) {
this.isShowing = set;
if(isShowing) {
timer = new Timer(200, this);
timer.start();
}
else {
timer.stop();
}
}
@Override
public void actionPerformed(ActionEvent e) {
if(!isShowing && timer.isRunning())
timer.stop();
if(text == null || text.equals("Downloading...")) {
text = "Downloading";
}
else
text += ".";
}
}
最佳答案
当您使用 Swing 时,您应该将长时间运行的任务放在单独的线程中。
这是教程:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
关于java - LayerUI仅在阻塞方法完成后才出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095322/
public class GraphicsBoard extends LayerUI { String picPath = "pictures/"; String[] fileName
有人建议on this Stack Overflow question在 Swing 应用程序中实现缩放的最佳方法是通过 Java 7 提供的 JLayer 装饰器。 我一直在关注 Oracle tu
我是一名优秀的程序员,十分优秀!