当前位置: 首页 > 知识库问答 >
问题:

Swing GUI GPA计算器

陆俊迈
2023-03-14

我正在开发一个应用程序,它将通过MyPanel类中的按钮和文本框从用户那里获取信息。到目前为止,这部分工作。现在我想显示用户在DisplayTable面板中输入的课程信息。我希望它在每次按下MyPanel类中的“添加课程”按钮时更新。我尝试在DisplayTable中添加一个函数,以便在每次按下按钮时添加一个标签,但由于一个是静态的,另一个不是静态的,所以我无法让它工作。有什么办法吗?(或关于如何改进应用程序的一般提示:))

班长

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();
    }
}

类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);
    }

}

类主面板

import javax.swing.*;

public class MainPanel extends JPanel {

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

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

类显示面板

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("");
    }

}

类我的面板

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);
        }
    }
}

共有1个答案

凤高翰
2023-03-14

你似乎没有必要使用静态。

static JLabel addLabel = new JLabel();

使以上非静态,(理想情况下也使私有)

public static void addElements

使上面的代码也成为非静态的,重命名为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(){
 类似资料:
  • 我有这个模式 列表表 [{“movie_id”:100,“gene1”:“犯罪”,“计数”:1,“id”:100},{“movie_id”:141267,“gene1”:“犯罪”,“计数”:1,“id”:141267},{“movie_id”:207932,“gene1”:“犯罪”,“计数”:1,“id”:207932},{“movie_id”:238636,“gene1”:“惊悚”,“计数”:1

  • 1.1.1 计算机与计算 计算机是当代最伟大的发明之一。自从人类制造出第一台电子数字计算机,迄今已近 70 年。经过这么多年的发展,现在计算机已经应用到社会、生活的几乎每一个方面。人们用计 算机上网冲浪、写文章、打游戏或听歌看电影,机构用计算机管理企业、设计制造产品或从 事电子商务,大量机器被计算机控制,手机与电脑之间的差别越来越分不清,……总之计算 机似乎无处不在、无所不能。那么,计算机究竟是如

  • 对两个输入进行加、减、乘、除四则运算 用法 Your browser does not support the video tag. 案例:数字标签 功能:显示数字的和 工作原理 选择一个操作符(“+”, “-“, “*”, “/”) 输出的就是两个输入的比较结果。

  • 对输入数值进行加、减、乘、除等四则运算 用法 Your browser does not support the video tag. 案例:数字标签 功能:显示数字的倍数 工作原理 选择一个操作符(“+”, “-“, “*”, “/”)和一个操作数(你想添加或删减的数字)。 输出的就是配置项中输入的计算结果。 Tips 如果输入不是一个数字,它将会输出错误 如果你想运算符在输入的右边,请用“高级

  • 1977年,Apple 计算机公司使个人计算(personal computer)得以普及。最初拥有一台计算机只是爱好者的梦想,随着它的价格不断降低,人们可以购买供个人或办公使用的计算机。1981年,世界上最大的计算机广家IBM公司推出了IBM个人计算机(IBM Personal computer)。一夜之间,个人计算机遍布公司、企业和政府机关。 然而这些计算机只是“独立”的个体,各自做自己的工作

  • 1 + 2 + 3 = 6 这是一个计算器应用程序,你可以在这里下载这个例子。 简介 这里的计算器是用响应式编程写的,而且它还用到了 RxFeedback 架构。它比较适合有经验的 RxSwift 使用者学习。接下来我们就来介绍一下这个应用程序是如何实现的。 整体结构 class CalculatorViewController: ViewController { @IBOutlet w

  • 平均值 # statistics_mean.py from statistics import * data = [1, 2, 2, 5, 10, 12] print('{:0.2f}'.format(mean(data))) # statistics_mode.py from statistics import * data = [1, 2, 2, 5, 10, 12] print(m

  • 我正在为学校开发一个简单的JavaFX计算器,我被困在一起,我被困在一起,该事件从两个文本字段,选择的单选按钮以及按下计算按钮时执行该事件的输入放在一起。 节目预览