Java 堆栈到 GUI 中

发布于 2025-01-05 01:19:27 字数 4579 浏览 4 评论 0原文

现在我正在学习编程文凭,我们有一项设定任务,即创建一个计算器来计算总数、平均值、计数器、输入的最大值和最小值、撤消按钮和清除按钮。我已经完成了所有操作,包括撤消按钮,但我的讲师通过在撤消方法中添加堆栈函数来设置额外的学分机会。我已经弄清楚如何推送对象,但我不确定如何弹出对象并将请求的对象添加到我的 GUI 中。我知道这并不是必需的,但我想在余生中都这样做,所以我真的很努力。如果有人能够帮助我,我的源文件如下。

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

import java.util.*;
import java.io.*;

public class DataPanel extends JPanel {
    ArrayList<Data> dataStore = new ArrayList<Data>();
    Stack dataStack = new Stack(); 

    private double _number, _oldNumber;
    private double _total, _oldTotal;
    private int _count, _oldCount;
    private double _average, _oldAverage;
    private double _min, _oldMin;
    private double _max, _oldMax;

    private JTextField _inField = new JTextField();
    private JTextField _totalField = new JTextField(); 
    private JTextField _averageField = new JTextField(); 
    private JTextField _minField = new JTextField(); 
    private JTextField _maxField = new JTextField(); 
    private JTextField _countField = new JTextField(); 

    public DataPanel() {
        setLayout(new GridLayout(6, 2, 1, 1));
        add(new JLabel("Number"));
        add(_inField);
        _inField.addActionListener(new InFieldListener());

        add(new JLabel("Total"));
        add(_totalField);   
        _totalField.setEditable(false);

        add(new JLabel("Count"));
        add(_countField);
        _countField.setEditable(false);

        add(new JLabel("Average"));
        add(_averageField);
        _averageField.setEditable(false);

        add(new JLabel("Maximum"));
        add(_maxField);
        _maxField.setEditable(false);

        add(new JLabel("Minimum"));
        add(_minField);
        _minField.setEditable(false);
    }

    public void clear() {
      _total = 0;
      _count = 0;
      _average = 0;
      _max = 0;
      _min = 0;

        _inField.setText("");
        _totalField.setText("");
        _countField.setText("");
        _averageField.setText("");
        _maxField.setText("");
        _minField.setText("");
    }

    public void undo() {
       /*_number = _oldNumber;
        _total = _oldTotal;
        _count = _oldCount;
        _average = _oldAverage;
        _max = _oldMax;
        _min = _oldMin;

        _inField.setText(String.valueOf(_number));
        _totalField.setText(String.valueOf(_total));
        _countField.setText(String.valueOf(_count));
        _averageField.setText(String.valueOf(_average));
        _maxField.setText(String.valueOf(_max));
        _minField.setText(String.valueOf(_min));*/

        /*int size = dataStore.size();
        dataStore.remove(size-1);*/
    }

    private class Data {
        private Data(double _number, double _total, int _count, double _average, double _max, double _min) {
          _number = _number;
          _total = _total;
          _count = _count;
          _average = _average;
          _max = _max;
          _min = _min;
       }
   }


    private class InFieldListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if(_inField.getText().equals("exit")) {
                System.exit(0);
            }       
            try {
                  _number = Double.parseDouble(_inField.getText());
                  _inField.setText("");

                /*_oldNumber = _number;
                _oldTotal = _total;
                _oldAverage = _average;
                _oldCount = _count;
                _oldMax = _max;
                _oldMin = _min;*/

                  _count++;

              if(_count == 1) {
                _min = _number;
                _max = _number;
              } else if(_number >= _max) {
                _max = _number;
              } else if(_number <= _min) {
                _min = _number;
              }

                  _total += _number;
                  _average = _total/_count;

              _totalField.setText(String.valueOf(_total));
             _countField.setText(String.valueOf(_count));
             _averageField.setText(String.valueOf(_average));
             _maxField.setText(String.valueOf(_max));
             _minField.setText(String.valueOf(_min));

             //dataStore.add(new Data(_number, _total, _count, _average, _max, _min));
             dataStack.add(new Data(_number, _total, _count, _average, _max, _min));

         } catch(NumberFormatException nfe) {
           System.out.println("There was a problem: " + nfe);
           _inField.setText("");
         }
        }
    }
}

/* */ 包围的所有语法都是原始的 undo 方法。

right now I'm studying my Diploma in Programming, we have a set task of creating a calculator to calculate the total, average, a counter, the maximum and minimum entered, an undo button and a clear button. I have everything done, including the undo button, but my lecturer has set an extra credit opportunity, by adding a stack function into the undo method. I've worked out how to push the objects, but I'm unsure on how to pop the object and add the requested object into my GUI. I understand this isn't exactly required, but I want to do this for the rest of my life, so I'm really trying hard. If anyone is able to help me, my source file is below.

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

import java.util.*;
import java.io.*;

public class DataPanel extends JPanel {
    ArrayList<Data> dataStore = new ArrayList<Data>();
    Stack dataStack = new Stack(); 

    private double _number, _oldNumber;
    private double _total, _oldTotal;
    private int _count, _oldCount;
    private double _average, _oldAverage;
    private double _min, _oldMin;
    private double _max, _oldMax;

    private JTextField _inField = new JTextField();
    private JTextField _totalField = new JTextField(); 
    private JTextField _averageField = new JTextField(); 
    private JTextField _minField = new JTextField(); 
    private JTextField _maxField = new JTextField(); 
    private JTextField _countField = new JTextField(); 

    public DataPanel() {
        setLayout(new GridLayout(6, 2, 1, 1));
        add(new JLabel("Number"));
        add(_inField);
        _inField.addActionListener(new InFieldListener());

        add(new JLabel("Total"));
        add(_totalField);   
        _totalField.setEditable(false);

        add(new JLabel("Count"));
        add(_countField);
        _countField.setEditable(false);

        add(new JLabel("Average"));
        add(_averageField);
        _averageField.setEditable(false);

        add(new JLabel("Maximum"));
        add(_maxField);
        _maxField.setEditable(false);

        add(new JLabel("Minimum"));
        add(_minField);
        _minField.setEditable(false);
    }

    public void clear() {
      _total = 0;
      _count = 0;
      _average = 0;
      _max = 0;
      _min = 0;

        _inField.setText("");
        _totalField.setText("");
        _countField.setText("");
        _averageField.setText("");
        _maxField.setText("");
        _minField.setText("");
    }

    public void undo() {
       /*_number = _oldNumber;
        _total = _oldTotal;
        _count = _oldCount;
        _average = _oldAverage;
        _max = _oldMax;
        _min = _oldMin;

        _inField.setText(String.valueOf(_number));
        _totalField.setText(String.valueOf(_total));
        _countField.setText(String.valueOf(_count));
        _averageField.setText(String.valueOf(_average));
        _maxField.setText(String.valueOf(_max));
        _minField.setText(String.valueOf(_min));*/

        /*int size = dataStore.size();
        dataStore.remove(size-1);*/
    }

    private class Data {
        private Data(double _number, double _total, int _count, double _average, double _max, double _min) {
          _number = _number;
          _total = _total;
          _count = _count;
          _average = _average;
          _max = _max;
          _min = _min;
       }
   }


    private class InFieldListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if(_inField.getText().equals("exit")) {
                System.exit(0);
            }       
            try {
                  _number = Double.parseDouble(_inField.getText());
                  _inField.setText("");

                /*_oldNumber = _number;
                _oldTotal = _total;
                _oldAverage = _average;
                _oldCount = _count;
                _oldMax = _max;
                _oldMin = _min;*/

                  _count++;

              if(_count == 1) {
                _min = _number;
                _max = _number;
              } else if(_number >= _max) {
                _max = _number;
              } else if(_number <= _min) {
                _min = _number;
              }

                  _total += _number;
                  _average = _total/_count;

              _totalField.setText(String.valueOf(_total));
             _countField.setText(String.valueOf(_count));
             _averageField.setText(String.valueOf(_average));
             _maxField.setText(String.valueOf(_max));
             _minField.setText(String.valueOf(_min));

             //dataStore.add(new Data(_number, _total, _count, _average, _max, _min));
             dataStack.add(new Data(_number, _total, _count, _average, _max, _min));

         } catch(NumberFormatException nfe) {
           System.out.println("There was a problem: " + nfe);
           _inField.setText("");
         }
        }
    }
}

All of the syntax that is surrounded by /* */ are the original undo method.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

儭儭莪哋寶赑 2025-01-12 01:19:27

您的代码:

dataStack.add(new Data(_number, _total, _count, _average, _max, _min));

应该是 push() 而不是 add()

然后,在 undo() 中,您可以调用 dataStack.pop() 并将从中返回的对象转换为 Data。 (替代方案:使用泛型)

然后取出每个 Data 的成员来恢复实例变量 _number 等等。

编辑:>我该如何扫描出来?

每次单击撤消按钮时,您只需恢复 (=pop()) 一个数据对象。然后,您可以询问它的变量并用这些变量恢复数据面板的变量。例子:

Data d = (Data)dataStack.pop();
_number = d._number;
...

Your code:

dataStack.add(new Data(_number, _total, _count, _average, _max, _min));

should be push() instead of add().

Then in undo() you can call dataStack.pop() and cast the object you get back from that to a Data. (Alternative: use generics)

Then you take out each of that Data's members to restore the instance-variables _number and so on.

EDIT: > How do I scan out though?

For every click on the undo-Button you only have to restore (=pop()) one Data-Object. You can then ask it for its variables and restore the DataPanel's variables with those. Example:

Data d = (Data)dataStack.pop();
_number = d._number;
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文