Сколько времени занимает проект для затмения? **ФИКСИРОВАННЫЙ** - PullRequest
0 голосов
/ 12 марта 2019

Хорошо, у меня есть проект в области компьютерных наук в моей школе.Проект заключается в создании графического интерфейса пользователя, который подсчитывает, какой налог нужно платить на доходы людей.Проблема, с которой я сталкиваюсь, состоит в том, что каждый раз, когда я хочу запустить свою программу, требуется 3 минуты, чтобы программа фактически запустилась.Многие люди, включая моего учителя, говорят, что это не нормально.Вот мой код:

package me.findTax;

/*
*   Notes:
*       Fix the location of all the elements and create the math part of the program
*
*       For some reason, takes eclipse a long time on home & school computers to run this program, not entirely sure why (2+ min)
*
*       If something is not working, try looking a make sure that the change method is called after everytime that the getQuestion method is called
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class Main { //gives questions (source not included, keylistener included (currently not working), actionlistener included)

static JRadioButton b1;
static JRadioButton b2;
static JFrame frame;
static JPanel panel;
static JLabel L1;
static JLabel L2;
static JTextField tfield;
static ButtonGroup bg = new ButtonGroup();
static JButton B1;
static double tax;

static boolean married;

static ArrayList<String> poss_Questions = new ArrayList<String>();

private static int q;
// Only need 2 buttons because there is only one prompt (yes or no)

public static void change() {
    if(q == 1) {
        b1.setVisible(false);
        b2.setVisible(false);
        tfield.setVisible(true);
        B1.setVisible(true);
    } else if(q == 2) {
        tfield.setVisible(false);
        B1.setVisible(false);
        L2.setText(Double.toString(tax)); //fix to make output more good
        L2.setVisible(true);
        L1.setLocation(10,20);
    }
}

public static String getQuestion(){
    String question = "";
    if(q == 0){
        question = poss_Questions.get(q);
    } else if(q == 1){
        question = poss_Questions.get(q);
    } else if(q == 2){
        doMath();
        question = poss_Questions.get(q);
    }
    q++;
    L1.setLocation(190, 20);
    if(L1.getText().length() > 16) {
        for(int t = 16; t < L1.getText().length(); t++) {
            L1.setLocation(L1.getX() - 1, L1.getY());
        }
    }
    if(L1.getText().length() < 16) {
        for(int z = 16; z > L1.getText().length(); z++) {
            L1.setLocation(L1.getX() + 1, L1.getY());
        }
    }
    return question;
}

public static void checkAnswer(){
    if(L1.getText().equals(poss_Questions.get(0))){
        if(b1.isSelected()){
            married = true;
        } else if(b2.isSelected()){
            married = false;
        }
    }
}

static int num;
public static void doMath(){
    if(married){
        try {
            num = Integer.parseInt(tfield.getText());
        } catch (NumberFormatException e) {
             JOptionPane.showMessageDialog(null, "Please enter a whole number above zero without decimal points, commas", "ERROR", JOptionPane.ERROR_MESSAGE);
             //may work
        }
        if(num > 0 && num <= 16000) {
            tax = num*0.10; // 10%
        } else if(num > 16000 && num <= 64000) {
            tax = (1600 + (0.15*(num - 16000)));
        } else if(num > 64000) {
            tax = (8800 + (0.25*(num - 64000)));
        } else {
            JOptionPane.showMessageDialog(null, "Please enter a value greater than 0, without decimal points, and not in a string format", "Invalid Entry", JOptionPane.ERROR_MESSAGE);
        }
    } else if(!married){ //if single
        try {
            num = Integer.parseInt(tfield.getText());
        } catch (NumberFormatException e) {
             JOptionPane.showMessageDialog(null, "Please enter a whole number above zero without decimal points, commas", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        //use else if loops and else (else prints out that there was an error)
        if(num > 0 && num <= 8000) {
            tax = num*0.10; // 10%
        } else if(num > 8000 && num <= 32000) {
            tax = (800 + (0.15*(num - 8000)));
        } else if(num > 32000) {
            tax = (4400 + (0.25*(num - 32000)));
        } else {
            JOptionPane.showMessageDialog(null, "Please enter a value greater than 0, without decimal points, and not in a string format", "Invalid Entry", JOptionPane.ERROR_MESSAGE);
        }
    }
}

public static void main(String args[]){
    poss_Questions.add("Are you married?");
    poss_Questions.add("How much do you make? ($$ per year)");
    poss_Questions.add("Here is how much tax will be taken away");

    System.err.println("1");

    b1 = new JRadioButton();
    b1.setText("Yes");
    b2 = new JRadioButton();
    b2.setText("No");

    System.err.println("2");

    b1.setVisible(true);
    b2.setVisible(true);
    b1.setBounds(75, 150, 200, 30);
    b2.setBounds(300, 150, 200, 30);

    System.err.println("3");

    bg.add(b1);
    bg.add(b2);

    System.err.println("4");

    B1 = new JButton();
    B1.setText("Submit");
    B1.setVisible(true);
    B1.setLocation(250, 50); 
    B1.setSize(75, 25); 
    B1.addActionListener(new ActionListener() { 
          public void actionPerformed(ActionEvent e) { 
            checkAnswer();
            L1.setText(getQuestion());
            change();
          } 
    });

    System.err.println("5");

    tfield = new JTextField();
    tfield.setVisible(false);
    tfield.setBounds(10, 50, 200, 20);

    System.err.println("6"); //last output on console until program runs

    L1 = new JLabel();
    L1.setText(getQuestion());
    change();
    L1.setSize(400, 20);
    L1.setLocation(10, 20);

    System.err.println("7");

    L2 = new JLabel();
    L2.setVisible(false);
    L2.setSize(400, 20);
    L2.setLocation(10, 60);
    L2.setText("Something went wrong");

    System.err.println("8");

    JOptionPane.showMessageDialog(null, L2.getX() + " " + L2.getY());

    panel = new JPanel();
    panel.setVisible(true);

    frame = new JFrame();
    frame.setVisible(true);

    frame.add(panel);
    frame.setSize(new Dimension(480, 270));
    frame.setResizable(false);

    System.err.println("9");

    panel.add(b1);
    panel.add(b2);
    panel.add(B1);
    panel.add(L1);
    panel.add(tfield);
    panel.add(L2);

    panel.setLayout(null);

    System.err.println("All");
}

}

Главный вопрос, который возникает у меня в голове, - почему это так долго.Сам файл занимает всего около 6 КБ, что, на мой взгляд, довольно мало и не должно занять много времени.Я пытался переместить файл с USB на рабочий стол, пробовал разные компьютеры, НИЧЕГО НЕ РАБОТАЕТ .Может быть, макет моего кода?

Я провел некоторое исследование, и ни один из форумов или учебных сайтов не сказал ничего похожего на эту проблему.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Я на самом деле набрал вашу программу.

В: Для запуска программ Eclipse требуется три минуты или дольше?

A: Нет, если только у вас нет медленного компьютера VERRRY, или вы превысили объем ОЗУ и не нажали своп.

В: вашей программе требуется до трех минут, прежде чем вы "что-то видите"?

A: Да.

SUGGESTION:

Установите точку останова в "main ()" и нажмите "F6", чтобы перейти на одну строку за раз (и / или "F5", чтобы перейти к функциям, которые вы хотите исследовать).

Подсказка: ваша программа должна быстро запуститься, и все пойдет быстро ... пока вы не нажмете "getQuestion ()";)

СИЛЬНОЕ ПРЕДЛОЖЕНИЕ:

Важной частью «программирования» является обучение устранению неполадок и устранению неполадок. Это отличный шанс познакомиться с тем, как использовать отладчик Eclipse для пошагового выполнения кода.

1 голос
/ 12 марта 2019

Программа запускается в «бесконечный» цикл.Если вы посмотрите в getQuestion () в последнем цикле:

if (L1.getText().length() < 16) {
   for (int z = 16; z > L1.getText().length(); z++) {
            L1.setLocation(L1.getX() + 1, L1.getY());
   }

Этот цикл начинается с 16, когда L1.getText (). Length () <16, следовательно, z> L1.getText (). Length ()верно по определению.

Когда z увеличивается с каждым циклом, z становится еще больше и будет еще больше удовлетворять условию.Так что оно увеличивается бесконечно.Ну, не бесконечно - когда он станет достаточно большим, он переполнится и станет отрицательным.Это когда это останавливается.

В приведенном ниже коде я заменил приращение на z.Хотя я не знаю, логично ли это, что вы хотите - он удаляет бесконечный цикл, и программа запускается намного быстрее.Это показывает, что эта ошибка вызывает ваши проблемы:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class Main { //gives questions (source not included, keylistener included (currently not working), actionlistener included)

    static JRadioButton b1;
    static JRadioButton b2;
    static JFrame frame;
    static JPanel panel;
    static JLabel L1;
    static JLabel L2;
    static JTextField tfield;
    static ButtonGroup bg = new ButtonGroup();
    static JButton B1;
    static double tax;

    static boolean married;

    static ArrayList<String> poss_Questions = new ArrayList<String>();

    private static int q=0;
// Only need 2 buttons because there is only one prompt (yes or no)

    public static String getQuestion() {
        String question = "";
        if (q == 0) {
            question = poss_Questions.get(q);
        } else if (q == 1) {
            question = poss_Questions.get(q);
            b1.setVisible(false);
            b2.setVisible(false);
            tfield.setVisible(true);
            B1.setVisible(true);
        } else if (q == 2) {
            doMath();
            question = poss_Questions.get(q);
            tfield.setVisible(false);
            B1.setVisible(false);
            L2.setText(Double.toString(tax)); //fix to make output more good
            L2.setVisible(true);
        }
        q++;
        L1.setLocation(190, 20);
        if (L1.getText().length() > 16) {
            for (int t = 16; t < L1.getText().length(); t++) {
                L1.setLocation(L1.getX() - 1, L1.getY());
            }
        }
        if (L1.getText().length() < 16) {
            for (int z = 16; z > L1.getText().length(); z--) {
                L1.setLocation(L1.getX() + 1, L1.getY());
            }
        }
        return question;
    }

    public static void checkAnswer() {
        if (L1.getText().equals(poss_Questions.get(0))) {
            if (b1.isSelected()) {
                married = true;
            } else if (b2.isSelected()) {
                married = false;
            }
        }
    }

    static int num;

    public static void doMath() {
        if (married) {
            try {
                num = Integer.parseInt(tfield.getText());
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(null, "Please enter a whole number above zero without decimal points, commas", "ERROR", JOptionPane.ERROR_MESSAGE);
                //may work
            }
            if (num > 0 && num <= 16000) {
                tax = num * 0.10; // 10%
            } else if (num > 16000 && num <= 64000) {
                tax = (1600 + (0.15 * (num - 16000)));
            } else if (num > 64000) {
                tax = (8800 + (0.25 * (num - 64000)));
            } else {
                JOptionPane.showMessageDialog(null, "Please enter a value greater than 0, without decimal points, and not in a string format", "Invalid Entry", JOptionPane.ERROR_MESSAGE);
            }
        } else if (!married) { //if single
            try {
                num = Integer.parseInt(tfield.getText());
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(null, "Please enter a whole number above zero without decimal points, commas", "ERROR", JOptionPane.ERROR_MESSAGE);
            }
            //use else if loops and else (else prints out that there was an error)
            if (num > 0 && num <= 8000) {
                tax = num * 0.10; // 10%
            } else if (num > 8000 && num <= 32000) {
                tax = (800 + (0.15 * (num - 8000)));
            } else if (num > 32000) {
                tax = (4400 + (0.25 * (num - 32000)));
            } else {
                JOptionPane.showMessageDialog(null, "Please enter a value greater than 0, without decimal points, and not in a string format", "Invalid Entry", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    public static void main(String args[]) {
        poss_Questions.add("Are you married?");
        poss_Questions.add("How much do you make? ($$ per year)");
        poss_Questions.add("Here is how much tax will be taken away");

        b1 = new JRadioButton();
        b1.setText("Yes");
        b2 = new JRadioButton();
        b2.setText("No");

        b1.setVisible(true);
        b2.setVisible(true);
        b1.setBounds(75, 150, 200, 30);
        b2.setBounds(300, 150, 200, 30);

        bg.add(b1);
        bg.add(b2);

        B1 = new JButton();
        B1.setText("Submit");
        B1.setVisible(true);
        B1.setLocation(340, 50);
        B1.setSize(75, 25);
        B1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                checkAnswer();
                L1.setText(getQuestion());
            }
        });

        tfield = new JTextField();
        tfield.setVisible(false);
        tfield.setBounds(100, 50, 200, 20);

        L1 = new JLabel();
        L1.setText(getQuestion());
        L1.setSize(400, 20);
        L1.setLocation(10, 20);

        L2 = new JLabel();
        L2.setVisible(false);
        L2.setSize(400, 20);
        L2.setLocation(10, 60);
        L2.setText("Something went wrong");

        JOptionPane.showMessageDialog(null, L2.getX() + " " + L2.getY());

        panel = new JPanel();
        panel.setVisible(true);

        frame = new JFrame();
        frame.setVisible(true);

        frame.add(panel);
        frame.setSize(new Dimension(480, 270));
        frame.setResizable(false);

        panel.add(b1);
        panel.add(b2);
        panel.add(B1);
        panel.add(L1);
        panel.add(tfield);
        panel.add(L2);

        panel.setLayout(null);

    }
}
...