簡體   English   中英

Swing-GUI GPA 計算器

[英]Swing-GUI GPA Calculator

我正在開發一個應用程序,它將通過 MyPanel class 中的按鈕和文本框從用戶那里獲取信息。 到目前為止,這部分有效。 現在我想顯示用戶在 DisplayTable 面板中輸入的課程信息。 我希望每次按下 MyPanel class 中的添加課程按鈕時它都會更新。 我嘗試將 function 添加到 DisplayTable 以在每次按下按鈕時添加 label 但我無法讓它工作,因為一個是 static 而一個不是。 關於如何做到這一點的任何想法?(或者關於如何改進應用程序的任何提示:))

Class 主要

public class Main {
    //TODO
    // PREVENT TYPE MISMATCH IN TEXT FIELDS
    // DISPLAY A TABLE OF COURSE NAMES - COURSE CREDITS - COURSE NAME AND THE GPA
    public static void main(String[] args) {
        new MyFrame();
    }
}

Class MyFrame

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

public class MyFrame extends JFrame{

    MainPanel mainPanel;

    MyFrame(){
        mainPanel = new MainPanel();

        this.add(mainPanel);
        this.setTitle("GPA Calculator");
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500,500);
        this.pack();
        this.setLocationRelativeTo(null);

        this.setVisible(true);
    }

}

Class 主面板

import javax.swing.*;

public class MainPanel extends JPanel {

    MyPanel myPanel = new MyPanel();
    DisplayPanel displayPanel = new DisplayPanel();

    MainPanel() {
        this.add(myPanel);
        this.add(displayPanel);
    }
}

Class 顯示面板

import javax.swing.*;
import java.awt.*;

public class DisplayPanel extends JPanel {

    static JLabel addLabel = new JLabel();

    public DisplayPanel() {
        this.setPreferredSize(new Dimension(500, 500));
        this.setBackground(new Color(0xEED2CC));
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    }

    public static void addElements(String courseName, int courseCredits, double courseGrade) {
        addLabel.setText(courseName + " " + courseCredits + " " + courseGrade);
        addLabel.setText("");
    }

}

Class 我的面板

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

public class MyPanel extends JPanel implements ActionListener{

    List<String> courseNames;
    List<Integer> courseCredits;
    List<Double> courseGrades;
    Thread thread;
    JLabel nameLabel;
    JLabel creditLabel;
    JLabel gradeLabel;
    JTextField nameField;
    JTextField creditField;
    JTextField gradeField;
    JButton calculateButton;
    JButton addCourseButton;
    JButton resetButton;
    JLabel message;


    double result = 0;
    int tempInt = 0;
    double tempDouble = 0;

    MyPanel() {

        message = new JLabel();
        message.setHorizontalAlignment(JLabel.CENTER);
        message.setFont(new Font("Helvetica Neue", Font.PLAIN, 35));
        message.setForeground(new Color(0xA1683A));
        message.setAlignmentX(JLabel.CENTER_ALIGNMENT);

        courseNames = new ArrayList();
        courseCredits = new ArrayList();
        courseGrades = new ArrayList();

        nameLabel = new JLabel();
        nameLabel.setHorizontalAlignment(JLabel.CENTER);
        nameLabel.setText("Course Name");
        nameLabel.setFont(new Font("Helvetica Neue", Font.PLAIN, 25));
        nameLabel.setForeground(new Color(0xA1683A));
        nameLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);

        nameField = new JTextField();
        nameField.setPreferredSize(new Dimension(300,30));
        nameField.setMaximumSize(nameField.getPreferredSize());

        creditLabel = new JLabel();
        creditLabel.setHorizontalAlignment(JLabel.CENTER);
        creditLabel.setText("Course Credits(ECTS)");
        creditLabel.setFont(new Font("Helvetica Neue", Font.PLAIN, 25));
        creditLabel.setForeground(new Color(0xA1683A));
        creditLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);

        creditField = new JTextField();
        creditField.setPreferredSize(new Dimension(300,30));
        creditField.setMaximumSize(creditField.getPreferredSize());

        gradeLabel = new JLabel();
        gradeLabel.setHorizontalAlignment(JLabel.CENTER);
        gradeLabel.setText("Your Grade");
        gradeLabel.setFont(new Font("Helvetica Neue", Font.PLAIN, 25));
        gradeLabel.setForeground(new Color(0xA1683A));
        gradeLabel.setAlignmentX(JLabel.CENTER_ALIGNMENT);

        gradeField = new JTextField();
        gradeField.setPreferredSize(new Dimension(300,30));
        gradeField.setMaximumSize(gradeField.getPreferredSize());


        resetButton = new JButton("Reset");
        resetButton.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        resetButton.addActionListener(this);
        addCourseButton = new JButton("Add Course");
        addCourseButton.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        addCourseButton.addActionListener(this);
        calculateButton = new JButton("Calculate GPA");
        calculateButton.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        calculateButton.addActionListener(this);

        //spacing and adding the elements
        this.add(Box.createRigidArea(new Dimension(0,20)));
        this.add(nameLabel);
        this.add(Box.createRigidArea(new Dimension(0,10)));
        this.add(nameField);
        this.add(Box.createRigidArea(new Dimension(0,20)));
        this.add(creditLabel);
        this.add(Box.createRigidArea(new Dimension(0,10)));
        this.add(creditField);
        this.add(Box.createRigidArea(new Dimension(0,20)));
        this.add(gradeLabel);
        this.add(Box.createRigidArea(new Dimension(0,10)));
        this.add(gradeField);
        this.add(Box.createRigidArea(new Dimension(0,20)));
        this.add(addCourseButton);
        this.add(Box.createRigidArea(new Dimension(0,5)));
        this.add(calculateButton);
        this.add(Box.createRigidArea(new Dimension(0,5)));
        this.add(resetButton);
        this.add(Box.createRigidArea(new Dimension(0,30)));
        this.add(message);
        this.setPreferredSize(new Dimension(500, 500));
        this.setBackground(new Color(0xEED2CC));
        this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
    }

    //calculate the GPA
    public double calculateGPA(){
        for (Integer courseCredit : courseCredits) {
            tempInt += courseCredit;
        }
        for(int i = 0; i<courseGrades.size();i++){
            tempDouble += courseGrades.get(i) * courseCredits.get(i);
        }
        return tempDouble/tempInt;
    }

    //create labels to display on the table
    public void createLabel(){

    }

    @Override
    public void actionPerformed(ActionEvent e) throws NumberFormatException {

        if(e.getSource().equals(addCourseButton)){

            //add items from the textFields to lists
            String tempText = nameField.getText();
            int tempCredit = Integer.parseInt(creditField.getText());
            double tempGrade = Double.parseDouble(gradeField.getText());
            courseNames.add(tempText);
            courseCredits.add(tempCredit);
            courseGrades.add(tempGrade);

            //set textFields to empty
            nameField.setText("");
            creditField.setText("");
            gradeField.setText("");

            //display a message for 3 seconds
            thread = new Thread();
            thread.start();
            message.setText("Course Added Successfully!");
            Timer timer = new Timer(3000, a -> message.setText(null));
            timer.setRepeats(false);
            timer.start();

            //add to table panel
            DisplayPanel.addElements(){

            }

        }

        //calculate the GPA, initialize the display panel
        //to display the courses names-credits-results and the gpa
        //as a table
        if(e.getSource().equals(calculateButton)){
            result = calculateGPA();
            message.setText(result + "");
        }

        //clear the lists,text fields and the message
        //get rid of the table panel
        if(e.getSource().equals(resetButton)){
            courseNames.clear();
            courseGrades.clear();
            courseCredits.clear();
            nameField.setText("");
            creditField.setText("");
            gradeField.setText("");
            message.setText(null);
        }
    }
}

您似乎在不需要的情況下使用了 static。

static JLabel addLabel = new JLabel();

使上述非靜態,(理想情況下也設為私有)

public static void addElements

使上述非 static 也,重命名為 setLabelText

DisplayPanel displayPanel = new DisplayPanel();
MyPanel myPanel = new MyPanel(displayPanel);

如上所示,將 displayPanel 作為參數傳遞給 myPanel。 顯然,在 MyPanel 中,您將擁有另外一個實例變量:

DisplayPanel displayPanel;

這將在構造函數中初始化。

在 MyPanel#actionPerformed 中,而不是:

//add to table panel
DisplayPanel.addElements(){
}

做:

displayPanel.addElements(....);

更確切地說

displayPanel.setLabelText(...);

在成績計算和重置時調用 DisplayPanel#setLabelText 方法。

同時調用

最后,刪除行:

addLabel.setText("");

如果你想要DisplayPanel,那為什么還要有以下呢?

public void createLabel(){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM