简体   繁体   English

我如何组织我的Java代码?

[英]How can I organize my Java code?

The title is not my entire question. 标题不是我的全部问题。 I know HOW to organize code, theoretically, but i would like some specific, USEFUL, pointers. 我知道如何组织代码,理论上,但我想要一些具体的,有用的,指针。 Please read on before griping. 请在握紧前阅读。

I'm a beginner to java and OOP (object oriented programming) and I would really like to learn how to better organize my code! 我是java和OOP(面向对象编程)的初学者,我真的想学习如何更好地组织我的代码! Over the course of a month or two, I made a calculator program with little functions I thought of here and there with a few small jokes built into it. 在一两个月的时间里,我制作了一个计算器程序,其功能很少,我想到这里有一些小的笑话。 After looking at it a second time I realized that it is extremely poorly formatted and almost incomprehensible.If I may, I would like to ask some more experienced programmers to point me in the right direction on what I should do to fix it (for example, what things can I turn into objects, Where can I compartmentalize, etc). 在第二次看到它后,我意识到它的格式非常糟糕,几乎无法理解。如果可以,我想请一些更有经验的程序员指出我应该做些什么来解决它(例如,我可以将什么东西变成对象,我可以在哪里划分,等等。

Please note that this is my FIRST time posting on a forum like this so if i need to clarify something for you to help me, I've done something wrong, I'm asking for too much, please tell me so i can resolve it and i can get help. 请注意,这是我第一次在这样的论坛上发帖,所以如果我需要澄清一些东西给你帮助我,我做错了什么,我要求太多,请告诉我,这样我就可以解决它我可以得到帮助 Please dont just mark this as invalid and file it away to oblivion (as often happens in stackoverflow). 不要只是将其标记为无效并将其归档为遗忘(通常在stackoverflow中发生)。 Also, before anyone asks, NO this is NOT homework, it is the product of my own crack at teaching myself java (probably why its not working too well). 此外,在任何人问之前,不,这不是家庭作业,它是我自己的教学自己java的产物(可能为什么它不能很好地工作)。

Here is the source code: 这是源代码:

// This is the original Calculator code without objects in a single class. not really efficient...
package randomClasses;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;

@SuppressWarnings("serial")
public class CalcClass
        extends JFrame
        implements ActionListener {
    JPanel[] row = new JPanel[6];
    JButton[] button = new JButton[21];
    String[] buttonString = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", ".", "/", "C", "v", "+/-", "=", "0", "Parabola", "x^y"};
    int[] dimW = {300, 45, 100, 90, 180};
    int[] dimH = {35, 40};
    Dimension displayDimension = new Dimension(dimW[0], dimH[0]);
    Dimension regularDimension = new Dimension(dimW[1], dimH[1]);
    Dimension rColumnDimension = new Dimension(dimW[2], dimH[1]);
    Dimension zeroButDimension = new Dimension(dimW[3], dimH[1]);
    Dimension parabolaDimension = new Dimension(dimW[4], dimH[0]);
    //formatting variables
    int var = 0;
    double x = 0;
    String stor = "";
    boolean initial = true;
    //variables for Parabola function
    int countEquals_parab = 0;
    double Angle = 0;
    double Vi = 0;
    double Vx = 0;
    double Vy = 0;
    double T_max = 0;
    double Y_displ = 0;
    double X_displ = 0;
    double h = 0;
    double k = 0;
    double a_parab = 0;
    boolean parabComplete = true;
    boolean parabola = false;
    DecimalFormat df = new DecimalFormat("#######.#####");
    //variables for addressing illegal typing issues
    boolean typeNum = true;
    boolean typeDot = true;
    JFrame frame; //for parabolaInstructions
    //original calculator variables
    boolean[] function = new boolean[5];
    double[] temporary = {0, 0}; //store on screen values
    double result = 0; //store result
    public JTextArea display = new JTextArea(1, 20);
    Font font = new Font("Times new Roman", Font.BOLD, 14);

    CalcClass() {
        super("CalcClass");
        setDesign();
        setSize(380, 300);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        GridLayout grid = new GridLayout(6, 5);
        setLayout(grid);
        for(int i = 0; i < 5; i++) {
            function[i] = false;
        }
        FlowLayout f1 = new FlowLayout(FlowLayout.CENTER);
        FlowLayout f2 = new FlowLayout(FlowLayout.CENTER, 1, 1);
        for(int i = 0; i < 6; i++) {
            row[i] = new JPanel();
        }
        row[0].setLayout(f1);
        for(int i = 1; i < 6; i++) {
            row[i].setLayout(f2);
        }
        for(int i = 0; i < 21; i++) {
            button[i] = new JButton();
            button[i].setText(buttonString[i]);
            button[i].setFont(font);
            button[i].addActionListener(this);
        }
        display.setFont(font);
        display.setEditable(false);
        display.setPreferredSize(displayDimension);
        for(int i = 0; i < 14; i++) {
            button[i].setPreferredSize(regularDimension);
        }
        for(int i = 14; i < 18; i++) {
            button[i].setPreferredSize(rColumnDimension);
        }
        button[18].setPreferredSize(zeroButDimension);
        button[19].setPreferredSize(parabolaDimension);
        button[20].setPreferredSize(rColumnDimension);
        row[0].add(display);
        add(row[0]);
        for(int i = 0; i < 4; i++) {
            row[1].add(button[i]);
        }
        row[1].add(button[14]);
        add(row[1]);
        for(int i = 4; i < 8; i++) {
            row[2].add(button[i]);
        }
        row[2].add(button[15]);
        add(row[2]);
        for(int i = 8; i < 12; i++) {
            row[3].add(button[i]);
        }
        row[3].add(button[16]);
        add(row[3]);
        row[4].add(button[18]);
        for(int i = 12; i < 14; i++) {
            row[4].add(button[i]);
        }
        row[4].add(button[17]);
        add(row[4]);
        row[5].add(button[19]);
        row[5].add(button[20]);
        add(row[5]);
        setVisible(true);
    }

    public void getSqrt() {
        stor = "";
        initial = true;
        try {
            double value = Double.parseDouble(display.getText());
            if(value == -100) {
                format("John's Girlfriend");
            } else {
                value = Math.sqrt(Double.parseDouble(display.getText())); //create a value for variable, and use Maths square root to find the value
                format(Double.toString(value)); //Sets display to new value
            }
        } catch(NumberFormatException e) {
        }
        typeDot = false;
        typeNum = false;
    }

    public void getPosNeg() {
        stor = "";
        initial = true;
        try {
            double value = Double.parseDouble(display.getText()); //again creating a variable for current value
            if(value != 0) { //if value is not equal to zero
                value = (-1) * value; //multiplied by -1 to change the sign
                format(Double.toString(value)); //Sets display to new value
            } else {
            }
        } catch(NumberFormatException e) {
        }
    }

    public void getResult() {
        temporary[1] = Double.parseDouble(display.getText());
        String temp0 = Double.toString(temporary[0]);
        String temp1 = Double.toString(temporary[1]);
        try {
            if(temp0.contains("-")) {
                String[] temp00 = temp0.split("-", 2);
                temporary[0] = (Double.parseDouble(temp00[1]) * -1);
            }
            if(temp1.contains("-")) {
                String[] temp11 = temp1.split("-", 2);
                temporary[1] = (Double.parseDouble(temp11[1]) * -1);
            }
        } catch(ArrayIndexOutOfBoundsException e) {
        }
        try {
            functions();
            clear();
            format(Double.toString(result));//display has a result
            for(int i = 0; i < 5; i++) {
                function[i] = false; //set all functions to false
            }
        } catch(NumberFormatException e) {
        }
        typeNum = false;
    }

    public void functions() {
        if(function[2] == true) { //multiplication 
            result = temporary[0] * temporary[1];
        } else if(function[3] == true) { //division
            result = temporary[0] / temporary[1];
        } else if(function[0] == true) { //addition
            result = temporary[0] + temporary[1];
        } else if(function[1] == true) { //subtraction;
            result = temporary[0] - temporary[1];
        } else if(function[4] == true) {
            result = Math.pow(temporary[0], temporary[1]);
        } else {
            result = temporary[1];
        }
    }

    double a_quadratic = 0;
    double b = 0;
    double c = 0;
    double x1 = 0;
    double x2 = 0;
    double discr = 0;
    int countEquals_quadratic = 0;

    public void quadraticFormula() {
        if(countEquals_parab == 0) {
            a_quadratic = Double.parseDouble(display.getText());
            clear();
            display.setText("b = ");
        }
        if(countEquals_parab == 1) {
            b = Double.parseDouble(display.getText());
            display.setText("c = ");
        }
        if(countEquals_parab == 2) {
            c = Double.parseDouble(display.getText());
            discr = (Math.pow(b, 2) - 4 * a_quadratic * c); //stores the value of the discriminant
            if(discr >= 0) {
                x1 = (-b + Math.sqrt(b * b - 4 * a_quadratic * c)) / (2 * a_quadratic);
                x2 = (-b - Math.sqrt(b * b - 4 * a_quadratic * c)) / (2 * a_quadratic);
            }
        }
    }

    public void parabolaButton() {
        double G = 9.81;
        if(countEquals_parab == 0) {
            Vi = Double.parseDouble(display.getText());
            clear();
            display.setText("Angle of release: ");
        }
        if(countEquals_parab == 1) {
            Angle = Double.parseDouble(display.getText());
            if((Angle > 90.0) || (Angle < 0.0)) {
                display.setText("Sorry, not a valid angle");
                countEquals_parab = 3;
            } else {
                Angle = (Math.PI / 180.0) * Angle;  //converting degrees into radians
                Vx = Vi * Math.cos(Angle); //Calculating x component
                Vy = Vi * Math.sin(Angle); //Calculating y component
                //Finding time
                T_max = Vy / G; //time to max height
                //Calculating vertex coordinates
                Y_displ = (Vy * Vy / (2 * G));
                X_displ = Vx * T_max;
                //finding a
                a_parab = (-Y_displ) / (X_displ * X_displ);
                display.setText("The equation of the parabola is \ny = " + df.format(a_parab) + "(x - " + df
                        .format(h) + ")^2 + " + df.format(k));
            }
        }
        if(countEquals_parab == 2) {
            display.setText("Time to get to max height = " + df.format(T_max));
        }
        if(countEquals_parab == 3) {
            clearFunction();
            countEquals_parab = -1;
            parabola = false;
            parabComplete = true;
        }
        countEquals_parab++;
    }

    public void var() {
        var++;
        if(var > 8) {
            var = 1;
        }
        if(var == 1) {
            format("x");
        }
    }

    public final void setDesign() {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch(Exception e) {
        }
    }

    public void format(String get) {
        //get stores the incoming values temporarily
        //get is transferred to a new value for permanent storage
        //print the permanent storage value
        //new number is added, stored temporarily in get
        //get is added to permanent storage
        //print permanent storage value
        double spaceFix = 0;
        if(initial == true) {
            stor = get;
            initial = false;
        } else if(initial == false) {
            stor = stor + get;
        }
        spaceFix = stor.length() / 4;
        int numberOfSpaces = 56 - stor.length() + (int) spaceFix;
        String format = String.format("%" + numberOfSpaces + "s", stor);
        display.setText(format);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource() == button[0]) {
            numberButtons("7");
        }
        if(ae.getSource() == button[1]) {
            numberButtons("8");
        }
        if(ae.getSource() == button[2]) {
            numberButtons("9");
        }
        if(ae.getSource() == button[3]) {
            operatorButtons(0); //add function[0]
        }
        if(ae.getSource() == button[4]) {
            numberButtons("4");
        }
        if(ae.getSource() == button[5]) {
            numberButtons("5");
        }
        if(ae.getSource() == button[6]) {
            numberButtons("6");
        }
        if(ae.getSource() == button[7]) {
            operatorButtons(1); //subtract function[1]
        }
        if(ae.getSource() == button[8]) {
            numberButtons("1");
        }
        if(ae.getSource() == button[9]) {
            numberButtons("2");
        }
        if(ae.getSource() == button[10]) {
            numberButtons("3");
        }
        if(ae.getSource() == button[11]) {
            operatorButtons(2); //multiplication function[2]
        }
        if(ae.getSource() == button[12]) {
            if(typeDot == false) {
            } else {
                numberButtons(".");
                typeDot = false;
            }
        }
        if(ae.getSource() == button[13]) {
            operatorButtons(3); //divide function[3]
        }
        if(ae.getSource() == button[14]) {
            clearFunction();
            parabola = false;
            parabComplete = true;
        }
        if(ae.getSource() == button[15]) {
            getSqrt();
        }
        if(ae.getSource() == button[16]) {
            getPosNeg();
        }
        if((ae.getSource() == button[17]) && display.getText().equals("")) {
        } else if((ae.getSource() == button[17]) && (parabola == false)) {
            getResult();
        } else if((ae.getSource() == button[17]) && (parabola == true)) {
            parabolaButton();
        }
        if(ae.getSource() == button[18]) {
            numberButtons("0");
        }
        if(ae.getSource() == button[19]) {
            clearFunction();
            parabolaInstructions();
            parabola = true;
            parabComplete = false;
            display.setText("Initial velocity: ");
        }
        if(ae.getSource() == button[20]) {
            operatorButtons(4);//powerFunction();
        }
    }

    public void parabolaInstructions() {
        //Create the dialog.
        final JDialog dialog = new JDialog(frame, "How to use the Parabola function");
        //Add contents to it. It must have a close button,
        //since some L&Fs (notably Java/Metal) don't provide one
        //in the window decorations for dialogs.
        JLabel label = new JLabel("<html><p align=center>" + "Step 1:  Type in the initial velocity and press the \"=\" button<br>" + "Step 2:  Type in the angle of Release (make sure that it is between 0 and 90)<br>" + "Step 3:  Press the \"=\" button to scroll through the results<br>" + "Step 4:  Profit");
        label.setHorizontalAlignment(JLabel.CENTER);
        Font font = label.getFont();
        label.setFont(label.getFont().deriveFont(font.PLAIN, 14.0f));
        JButton closeButton = new JButton("Ok");
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });
        JPanel closePanel = new JPanel();
        closePanel.setLayout(new BoxLayout(closePanel, BoxLayout.LINE_AXIS));
        closePanel.add(Box.createHorizontalGlue());
        closePanel.add(closeButton);
        closePanel.setBorder(BorderFactory.
                createEmptyBorder(0, 0, 5, 5));
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.add(label, BorderLayout.CENTER);
        contentPane.add(closePanel, BorderLayout.PAGE_END);
        contentPane.setOpaque(true);
        dialog.setContentPane(contentPane);
        //Show it.
        dialog.setSize(new Dimension(400, 200));
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

    public void numberButtons(String i) {
        if(typeNum == false) {
            display.setText("");
            format(i);
        } else {
            format(i);
        }
        typeNum = true;
    }

    public void operatorButtons(int funct) {
        if(display.getText().equals("")) {
        } else {
            temporary[0] = Double.parseDouble(display.getText());
            function[funct] = true;
            clear();
        }
    }

    public void clearFunction() {
        clear();
        try {
            for(int i = 0; i < 5; i++) {
                function[i] = false;
            }
            for(int i = 0; i < 2; i++) {
                temporary[i] = 0;
            }
        } catch(NullPointerException e) {
        }
        //For parabola()
        Vi = 0;
        Vx = 0;
        Vy = 0;
        T_max = 0;
        Y_displ = 0;
        X_displ = 0;
        h = 0;
        k = 0;
        a_parab = 0;
    }

    public void clear() {
        display.setText("");
        stor = "";
        typeDot = true;
        initial = true;
    }

    public static void main(String[] arguments) {
        CalcClass c = new CalcClass();
    }
}

Ok so now you've seen my mess... I sort-of know what I should do and YES I did some research but I feel it would be much easier to learn organization through example or a nice push than it would be from reading articles that tell you ultra-hypothetical or loosely-analogous examples of what objects are. 好吧,所以现在你已经看到了我的混乱...我知道我应该做什么,是的,我做了一些研究,但我觉得通过示例学习组织或者比通过阅读更好的推动会更容易这些文章告诉你什么是对象的超假设或松散类似的例子。 Note: I tried using methods to organize and my class looks much better than what it did (I also made the whole thing an object to be called upon at the bottom which is pretty much useless). 注意:我尝试使用方法进行组织,我的类看起来比它做的要好得多(我还把整个事情做成了一个在底部被调用的对象,这几乎没用)。

If you use eclipse, try: 如果您使用eclipse,请尝试:

Window > Prefferences > Java > Editor > Save Actions 窗口>首选项> Java>编辑器>保存操作

Check "perform the selected actions on save", "Additional Actions" and click "Configure". 选中“保存时执行选定的操作”,“其他操作”,然后单击“配置”。

Using eclipse's Save Actions can be really useful in real life coding, but you will probably learn some neat java tricks going through the Save Actions wizard. 使用eclipse的Save Actions对于现实生活中的编码非常有用,但是你可能会通过Save Actions向导学习一些巧妙的java技巧。

Java is an Object Oriented language. Java是面向对象的语言。 You need to take advantage of that fact. 你需要利用这个事实。
Use classes to separate your code into different logical / structural components. 使用类将代码分成不同的逻辑/结构组件。 Learn how to use OOP. 学习如何使用OOP。 Follow SOLID design and use design patterns . 遵循SOLID设计并使用设计模式

Another important thing is to know your language . 另一件重要的事情是了解你的语言 Start by reading basic classes javadoc s and relevant sections of the java spec. 首先阅读基本类javadoc和java规范的相关部分。 I would begin with deeply understanding the different types of java ( class , interface , enum and inner / nested / anonymous types) and the different modifiers ( private , public , protected , static , abstract , final , default ). 我将首先深入理解不同类型的java( classinterfaceenum和内部/嵌套/匿名类型)和不同的修饰符( privatepublicprotectedstaticabstractfinaldefault )。

Some other eclipse's short cuts: 其他一些日食的捷径:

  • CTRL-A , CTRL-I ("indentation") will fix your code indentation. CTRL-ACTRL-I (“缩进”)将修复代码缩进。
  • CTRL-SHIFT-O ("organize imports") will omit redundant imports. CTRL-SHIFT-O (“组织导入”)将省略冗余导入。

  • You might consider taking a look at Code Complete, which deals with the issues that you're concerned with here, and otherwise is just a classic in our field that every serious developer should read. 您可以考虑查看代码完成,它处理您在此处关注的问题,否则只是我们领域的经典,每个认真的开发人员都应该阅读。

    In general, when you're organizing code you should do so with a few things in mind: readability and atomicity. 通常,当您组织代码时,您应该考虑以下几点:可读性和原子性。 These two factors apply to code on every level of an application, from variable naming, routines, methods, classes, packages, and so on. 这两个因素适用于应用程序的每个级别上的代码,包括变量命名,例程,方法,类,包等。

    Readability is a simple idea: can a human being read this code and understand it? 可读性是一个简单的想法:人类可以阅读这些代码并理解它吗? To gauge the readability of the code all you have to do is read it! 要衡量代码的可读性,您只需阅读即可! Do variable names help the reader understand what something is? 变量名是否有助于读者理解什么是什么? Are routines and classes properly formatted and not needlessly complex? 例程和类是否正确格式化并且不是不必要的复杂? Have you removed all code that isn't being used? 您是否删除了所有未使用的代码? Is your code written in a logical progression? 您的代码是按逻辑进程编写的吗?

    Atomicity is the idea that everything should have one purpose. 原子性是一切都应该有一个目的的想法。 A function or method should (usually) do one thing and one thing only. 一个函数或方法应该(通常)只做一件事和一件事。 A class should usually be a logical grouping of related methods and fields serving some type of unique purpose, and NOT a mish-mash of unrelated stuff. 一个类通常应该是相关方法和字段的逻辑分组,这些方法和字段服务于某种类型的独特目的,而不是一堆不相关的东西。 A package should also contain a set of related files. 包还应包含一组相关文件。 Same with a project, and so on. 与项目相同,依此类推。

    The main benefit of atomicity is that once you get into more involved applications it's actually much easier to debug and isolate issues in your code because you know where stuff is . 原子性的主要好处是,一旦你进入更多涉及的应用程序, 它实际上更容易调试和隔离代码中的问题,因为你知道什么是东西 For instance: I have a database access error! 例如:我有数据库访问错误! Good thing I have a package that's specifically defined for my database access objects. 好东西我有一个专门为我的数据库访问对象定义的包。

    I know when I was just getting started in the field this was something that threw me off too. 我知道当我刚刚开始在野外时,这也是让我失望的东西。 It might not be until you do a lot of coding within more significant apps that you really start to understand best practices and why people build stuff a certain way. 它可能不会是你在更重要的应用程序中进行大量编码,你真正开始理解最佳实践以及人们为什么以某种方式构建东西。

    Thanks to everyone who contributed to my problem, I completely scrapped this garbage and made it 1000 times better. 感谢所有为我的问题做出贡献的人,我完全废弃了这些垃圾并使它变好了1000倍。 I knew from the beginning it was poorly made and I wanted to fix it, I just didn't know where to start. 我从一开始就知道它制作很差,我想解决它,我只是不知道从哪里开始。 After reading all the advice that was given, watching a few tutorials and brushing up on some simple java concepts (modifiers, jswing, etc), I ended up making a new one that is in MVC format (Yay, order and efficiency). 在阅读了所有给出的建议,观看了一些教程并了解了一些简单的java概念(修饰符,jswing等)之后,我最终创建了一个MVC格式的新方法(Yay,order and efficiency)。 Now all my new variables are actually meaningful (Thanks @maaartinus for helping me realize that many of my variables were poorly named and made my whole program unnecessarily complicated). 现在我所有的新变量实际上都是有意义的(感谢@maaartinus帮助我意识到我的许多变量都命名不佳并且使我的整个程序变得不必要复杂)。 Also, I tried to work on SRP (Not 100% sure if I completely did it but with the program organized it will be easy to change things) and I plan on adding units later for good practice (Thank you, @Robert Snyder). 此外,我试图研究SRP(不是100%肯定,如果我完全做到了,但程序组织起来很容易改变的东西),我计划稍后添加单元以进行良好实践(谢谢你,@ Robert Snyder)。 This new GUI is ugly but that can always be changed later and since It is now in MVC format the job will be easier. 这个新的GUI很难看,但以后总是可以更改,因为它现在是MVC格式,工作将更容易。

    Here is what I did (not finished and far from perfect but a step in the right direction): 这就是我所做的(没有完成,远非完美,但朝着正确的方向迈出了一步):

    CalcGui.java CalcGui.java

    package com.Calculator;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class CalcGui extends JFrame {
    
    private static final long serialVersionUID = 1L;
    private String[] operatorsList = { "+", "-", "*", "/", "^" };
    
    // Row 1
    private JTextField firstNumber = new JTextField(10);
    private JComboBox<String> operator = new JComboBox<>(operatorsList);
    private JTextField secondNumber = new JTextField(10);
    private JButton calculateButton = new JButton("Calculate");
    private JTextField calcSolution = new JTextField(20);
    
    // Row 2
    private JLabel sqrtSymbol = new JLabel("√");
    private JTextField sqrtNumber = new JTextField(10);
    private JButton sqrtCalcButton = new JButton("Calculate");
    private JTextField sqrtCalcSolution = new JTextField(20);
    
    // Row 3
    private JLabel quadraticLabel1 = new JLabel("A = ");
    private JTextField quadraticFirstNumber = new JTextField(5);
    private JLabel quadraticLabel2 = new JLabel("B = ");
    private JTextField quadraticSecondNumber = new JTextField(5);
    private JLabel quadraticLabel3 = new JLabel("C = ");
    private JTextField quadraticThirdNumber = new JTextField(5);
    private JButton quadraticCalcButton = new JButton("Calculate");
    private JLabel quadraticTextBefore = new JLabel("x =");
    private JTextField firstQuadraticCalcSolution = new JTextField(3);
    private JLabel quadraticTextMiddle = new JLabel("and x =");
    private JTextField secondQuadraticCalcSolution = new JTextField(3);
    
    CalcGui() {
    
        JPanel calcPanel = new JPanel(new BorderLayout());
        FlowLayout Default = new FlowLayout(FlowLayout.LEFT);
        JPanel row1 = new JPanel(Default);
        JPanel row2 = new JPanel(Default);
        JPanel row3 = new JPanel(Default);
    
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(650, 150);
    
        row1.add(firstNumber);
        row1.add(operator);
        row1.add(secondNumber);
        row1.add(calculateButton);
        row1.add(calcSolution);
    
        row2.add(sqrtSymbol);
        row2.add(sqrtNumber);
        row2.add(sqrtCalcButton);
        row2.add(sqrtCalcSolution);
    
        row3.add(quadraticLabel1);
        row3.add(quadraticFirstNumber);
        row3.add(quadraticLabel2);
        row3.add(quadraticSecondNumber);
        row3.add(quadraticLabel3);
        row3.add(quadraticThirdNumber);
        row3.add(quadraticCalcButton);
        row3.add(quadraticTextBefore);
        row3.add(firstQuadraticCalcSolution);
        row3.add(quadraticTextMiddle);
        row3.add(secondQuadraticCalcSolution);
    
        calcPanel.add(row1, BorderLayout.NORTH);
        calcPanel.add(row2, BorderLayout.CENTER);
        calcPanel.add(row3, BorderLayout.SOUTH);
        this.add(calcPanel);
    
    }
    
    // basic calculations methods
    public double getFirstNumber() {
    
        return Double.parseDouble(firstNumber.getText());
    
    }
    
    public String getOperator() {
    
        return (String) operator.getSelectedItem();
    
    }
    
    public double getSecondNumber() {
    
        return Double.parseDouble(secondNumber.getText());
    
    }
    
    public void setCalcSolution(double solution) {
    
        calcSolution.setText(Double.toString(solution));
    
    }
    
    void addCalculateListener(ActionListener listenForCalcButton) {
    
        calculateButton.addActionListener(listenForCalcButton);
    
    }
    
    void displayErrorMessage(String errorMessage) {
    
        JOptionPane.showMessageDialog(this, errorMessage);
    
    }
    
    // Square root function methods
    public double getSqrtNumber() {
    
        return Double.parseDouble(sqrtNumber.getText());
    
    }
    
    public void setSqrtCalcSolution(double solution) {
    
        sqrtCalcSolution.setText(Double.toString(solution));
    
    }
    
    void addSqrtCalcListener(ActionListener listenForSqrtCalcButton) {
    
        sqrtCalcButton.addActionListener(listenForSqrtCalcButton);
    
    }
    
    // Quadratic formula Methods
    public double getQuadraticFirstNumber() {
    
        return Double.parseDouble(quadraticFirstNumber.getText());
    
    }
    
    public double getQuadraticSecondNumber() {
    
        return Double.parseDouble(quadraticSecondNumber.getText());
    
    }
    
    public double getQuadraticThirdNumber() {
    
        return Double.parseDouble(quadraticThirdNumber.getText());
    
    }
    
    public void setFirstQuadraticCalcSolution(double solution) {
    
        firstQuadraticCalcSolution.setText(Double.toString(solution));
    
    }
    
    public void setSecondQuadraticCalcSolution(double solution) {
    
        secondQuadraticCalcSolution.setText(Double.toString(solution));
    
    }
    
    void addQuadraticCalcListener(ActionListener listenForQuadraticCalcButton) {
    
        quadraticCalcButton.addActionListener(listenForQuadraticCalcButton);
    
    }
    }
    

    CalcModel.java CalcModel.java

    package com.Calculator;
    
    public class CalcModel {
    
    private double calcValue;
    
    public void calculate(double firstNumber, double secondNumber,
            String operator) {
    
        if (operator.equals("+")) {
    
            calcValue = firstNumber + secondNumber;
    
        }
    
        if (operator.equals("-")) {
    
            calcValue = firstNumber - secondNumber;
    
        }
        if (operator.equals("*")) {
    
            calcValue = firstNumber * secondNumber;
    
        }
        if (operator.equals("/")) {
    
            calcValue = firstNumber / secondNumber;
    
        }
    
        if (operator.equals("^")) {
    
            calcValue = Math.pow(firstNumber, secondNumber);
    
        }
    }
    
    public double getCalcValue() {
    
        return calcValue;
    
    }
    
    }
    

    SqrtCalcModel.java SqrtCalcModel.java

    package com.Calculator;
    
    public class SqrtCalcModel {
    
    private double sqrtCalcValue;
    
    public void sqrt(double number) {
    
        sqrtCalcValue = Math.sqrt(number);
    
    }
    
    public double getSqrtCalcValue() {
    
        return sqrtCalcValue;
    
    }
    }
    

    QuadraticCalcModel.java QuadraticCalcModel.java

    package com.Calculator;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    public class QuadraticCalcModel {
    
    private double firstQuadraticCalcValue;
    private double secondQuadraticCalcValue;
    
    public void quadraticFormula(double a, double b, double c) {
    
        double discriminant = (b * b) - (4 * a * c);
    
        if (discriminant >= 0) {
    
            firstQuadraticCalcValue = (Math.sqrt((b * b) - (4 * a * c)) + (-b))
                    / (2 * a);
    
            secondQuadraticCalcValue = (Math.sqrt((b * b) - (4 * a * c)) - (-b))
                    / (2 * a);
    
        }
    
        else {
    
            JFrame parent = new JFrame();
            JOptionPane.showMessageDialog(parent,
                    "This function has no real roots.");
    
        }
    
    }
    
    public double getFirstQuadraticValue() {
    
        return firstQuadraticCalcValue;
    
    }
    
    public double getSecondQuadraticValue() {
    
        return secondQuadraticCalcValue;
    
    }
    
    }
    

    CalculatorControler.java CalculatorControler.java

    package com.Calculator;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class CalculatorController {
    
    private CalcGui theGui;
    private CalcModel theCalcModel;
    private SqrtCalcModel theSqrtCalcModel;
    private QuadraticCalcModel theQuadraticCalcModel;
    
    public CalculatorController(CalcGui theGui, CalcModel theCalcModel,
            SqrtCalcModel theSqrtCalcModel,
            QuadraticCalcModel theQuadraticCalcModel) {
        this.theGui = theGui;
        this.theCalcModel = theCalcModel;
        this.theSqrtCalcModel = theSqrtCalcModel;
        this.theQuadraticCalcModel = theQuadraticCalcModel;
    
        this.theGui.addCalculateListener(new CalcListener());
        this.theGui.addSqrtCalcListener(new SqrtCalcListener());
        this.theGui.addQuadraticCalcListener(new QuadraticCalcListener());
    }
    
    class CalcListener implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
    
            double firstNumber, secondNumber = 0;
            String operator;
    
            try {
    
                firstNumber = theGui.getFirstNumber();
                operator = theGui.getOperator();
                secondNumber = theGui.getSecondNumber();
    
                theCalcModel.calculate(firstNumber, secondNumber, operator);
    
                theGui.setCalcSolution(theCalcModel.getCalcValue());
    
            }
    
            catch (NumberFormatException ex) {
    
                System.out.println(ex);
    
                theGui.displayErrorMessage("You Need to Enter 2 Numbers");
    
            }
        }
    }
    
    class SqrtCalcListener implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
    
            double number = 0;
    
            try {
    
                number = theGui.getSqrtNumber();
    
                theSqrtCalcModel.sqrt(number);
    
                theGui.setSqrtCalcSolution(theSqrtCalcModel.getSqrtCalcValue());
    
            }
    
            catch (NumberFormatException ex) {
                System.out.println(ex);
    
                theGui.displayErrorMessage("You Need to enter a Number");
            }
        }
    }
    
    class QuadraticCalcListener implements ActionListener {
    
        public void actionPerformed(ActionEvent e) {
    
            double a, b, c = 0;
    
            try {
    
                a = theGui.getQuadraticFirstNumber();
                b = theGui.getQuadraticSecondNumber();
                c = theGui.getQuadraticThirdNumber();
    
                theQuadraticCalcModel.quadraticFormula(a, b, c);
    
                theGui.setFirstQuadraticCalcSolution(theQuadraticCalcModel
                        .getFirstQuadraticValue());
    
                theGui.setSecondQuadraticCalcSolution(theQuadraticCalcModel
                        .getSecondQuadraticValue());
    
            }
    
            catch (NumberFormatException ex) {
    
                System.out.println(ex);
    
                theGui.displayErrorMessage("You need to enter 3 numbers.");
            }
    
        }
    }
    
    }
    

    MVCCalculator.java MVCCalculator.java

    package com.Calculator;
    
    public class MVCCalculator {
    
    public static void main(String[] args) {
    
        CalcGui theGui = new CalcGui();
    
        CalcModel theCalcModel = new CalcModel();
    
        SqrtCalcModel theSqrtCalcModel = new SqrtCalcModel();
    
        QuadraticCalcModel theQuadraticCalcModel = new QuadraticCalcModel();
    
        new CalculatorController(theGui, theCalcModel, theSqrtCalcModel,
                theQuadraticCalcModel);
    
        theGui.setVisible(true);
    
    }
    }
    

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM