Javaでカスタム読み込み画面を作成しようとしています(JProgressBar
を使用していません)。今私はちょうど黒い矩形で左から右の画面をゆっくりと塗りつぶすローディングバーを作ってみました。これをテストするために、乱数を考慮する単純なプログラムを作った。ファクタリングコードを別のスレッドで実行し、グラフィックスに100ミリ秒ごとに1回の分解処理が行われるようにします。ただし、アプリケーションが10秒間応答しなくなり、その後も実行されることがあります。 Javaでカスタム読み込み画面を正しく実装するにはどうすればよいですか。ここでJavaでカスタム読み込み画面を正しく実装する方法
はコードです:ここでは
public class Factorer implements Runnable, Loadable {
private static Random r = new Random();
private volatile int numOn;
private volatile int numsTotal;
public static void main(String[] args){
Factorer fact = new Factorer(25);
LoadingFrame f = new LoadingFrame(fact);
fact.run();
}
public Factorer(int nNums){
numsTotal = nNums;
}
public void factorRandomNumber(){
int randomNumber = r.nextInt(Integer.MAX_VALUE);
int n = randomNumber;
List<Integer> factors = new ArrayList<Integer>();
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
}
}
public void factorRandomNumbers(){
for(numOn = 0; numOn < numsTotal; numOn++){
factorRandomNumber();
}
}
public float getProgress(){
return ((float) numOn)/((float) numsTotal);
}
@Override
public void run() {
factorRandomNumbers();
}
}
は、ロード可能なインタフェースである:ここで
public interface Loadable {
public float getProgress();
}
は、グラフィックスクラスです:
public class LoadingFrame extends JFrame {
private static final long serialVersionUID = 8290713730328501888L;
private static final int WIDTH = 400;
private static final int HEIGHT = 400;
private Loadable loadable;
public LoadingFrame(Loadable l){
super("Loading Test");
this.loadable = l;
this.setSize(WIDTH, HEIGHT);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
Timer t = new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
});
t.start();
}
@Override
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillRect(0, 0, (int) (loadable.getProgress() * (float) WIDTH), HEIGHT);
}
}
['SplashScreen'](http://docs.oracle.com/javase/8/docs/api/java/awt/SplashScreen.html)を参照してください。速度については、それは完全にAWTベースです。チュートリアルの[スプラッシュスクリーンの作成方法](http://docs.oracle.com/javase/tutorial/uiswing/misc/splashscreen.html)も参照してください。 –
@AndrewThompsonは、プログラムが既に起動した後、読み込み画面を表示したい場合は、その作業を行いますか? –
AFAIUはい、私はそれを使ったことはありません。 –