2

Pi の値を計算するためにコードを書いていますが、計算に時間がかかる場合があります。進行状況を表示するために進行状況バーを追加しましたが、コードは私が言ったことを正確に実行し、計算後に進行状況バーを開き、すぐに閉じます (値が 100 に達すると閉じます)。コードを貼り付けようとしました。プログレスバーをループに入れましたが、すぐにソリューションを解決することに気付きましたが、マルチプログレスバーウィンドウが作成されます。計算の前に配置すると、進行状況バーは 0 のままです (明らかに) 以下にコードを表示しました。

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.border.Border;
import java.util.Scanner;

public class PicCalc 
{
public static void main(String args[]) 
{
  Scanner keyboard = new Scanner(System.in);
  double i = 0;
    double stage = 1;
  int iterations = 1;
    int x = 3; //Simply a variable to calculate pi
  double y = -1.0; // Another variable for pi
    double myPi; //This is my calculation of Pi, don't eat it. 

  System.out.println("Hello! I calculate Pi and compare it to the acutal value of Pi!");
  System.out.println("How many iterations?");
  iterations = keyboard.nextInt();

  //Calculates Pi
  for (i = 1.0; i <= iterations; i++)
  {
         stage = stage + y/x;
         y = - y; //Flips Sign
         x+=2; 
  }

    myPi = 4*stage;
    System.out.println("My Pi: " + myPi);
    //STOP CALCULATING PI

    //CALCULATE PERCENT COMPLETE
  double percent = 100*(i/iterations);
  int intPercent = (int) (percent + 0.5); //Adds .5 in order to round.
  //STOP CALCULATING PERCENT COMPLETE

  //MAKES LOADING SCREEN
  JFrame f = new JFrame("Loading...");
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  Container content = f.getContentPane();
  JProgressBar progressBar = new JProgressBar();
  progressBar.setValue(intPercent);
  progressBar.setStringPainted(true);
  Border border = BorderFactory.createTitledBorder("Calcualating...");
  progressBar.setBorder(border);
  content.add(progressBar, BorderLayout.NORTH);
  f.setSize(300, 100);
  f.setVisible(true);
  //END OF MAKING LOADING SCREEN

 //CLOSES LOADING SCREEN WHEN 100% IS ACHIEVED
  if (percent >= 100)
  {
     f.dispose();
  }      
  //END OF CLOSING SCREEN HERE
4

3 に答える 3

0

基本的に3つの問題があります:

  1. パーセント計算が for ループから外れています
  2. 無効なパーセント計算
  3. 計算が完了した後にフォームを表示しようとしています

私のコメントで完全な作業コードを確認してください:

static private double myPi; // This is my calculation of Pi, don't eat it.
public static void main(String[] args)
{
    Scanner keyboard = new Scanner(System.in);

    System.out.println("Hello! I calculate Pi and compare it to the acutal value of Pi!");
    System.out.println("How many iterations?");
    final int iterations = keyboard.nextInt(); // me!!!: i needed to set 2000000000 to see actual window on my computer :)

    // MAKES LOADING SCREEN
    // me!!!: you should create frame before calculations, not after
    final JFrame f = new JFrame("Loading...");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final Container content = f.getContentPane();
    final JProgressBar progressBar = new JProgressBar();
    progressBar.setStringPainted(true);
    Border border = BorderFactory.createTitledBorder("Calcualating...");
    progressBar.setBorder(border);
    content.add(progressBar, BorderLayout.NORTH);
    f.setSize(300, 100);
    f.setVisible(true);
    // END OF MAKING LOADING SCREEN

    // Calculates Pi
    Thread thread = new Thread() {
        public void run(){
            double stage = 1;
            int x = 3; // Simply a variable to calculate pi
            double y = -1.0; // Another variable for pi

            for (int i = 1; i <= iterations; i++)
            {
                stage = stage + y / x;
                y = -y; // Flips Sign
                x += 2;

                // CALCULATE PERCENT COMPLETE
                // me!!!: you're always getting 0 with your old method here
                double percent = 100.0 * i / iterations;
                int intPercent = (int) (percent + 0.5); // Adds .5 in order to round.
                progressBar.setValue(intPercent);
                // STOP CALCULATING PERCENT COMPLETE
            }
            myPi = 4 * stage;
        }
    };
    thread.start();
    try
    {
        thread.join();
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    System.out.println("My Pi: " + myPi);
    // STOP CALCULATING PI

    // CLOSES LOADING SCREEN WHEN 100% IS ACHIEVED
    f.dispose();
    // END OF CLOSING SCREEN HERE
}
于 2013-10-25T01:10:44.110 に答える