2012-02-13 73 views
4

现在我正在学习我的程序设计文凭,我们有一个创建计算器来计算总计,平均值,计数器,输入的最大值和最小值,撤消按钮和清除按钮。我已经完成了所有工作,包括撤销按钮,但是我的讲师通过在撤消方法中添加了一个堆栈函数来设置额外的信用机会。我已经研究过如何推送对象,但我不确定如何弹出对象并将请求的对象添加到我的GUI中。我明白这不是完全必要的,但我想在我的余生中这样做,所以我真的很努力。如果有人能够帮助我,我的源文件如下。Java Stack into 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方法。

回答

3

您的代码:

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

应该push()而不是add()

然后在undo()中,您可以调用dataStack.pop()并将您从中获得的对象转换为Data。 (可选:使用泛型)

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

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

对于每次点击撤销按钮,你只需要恢复(= pop())一个数据对象。然后你可以询问它的变量并用这些变量恢复DataPanel的变量。例如:

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

糟糕,我有点糊涂.push()为.add()哈哈。 但我怎么实际上扫描它?就像扫描仪一样? (while(scan.hasNext())? – 2012-02-13 14:13:19

+3

Moron?No!它只是通过练习的经验,继续前进 – 2012-02-13 14:14:13

+0

我如何扫描出来?我有这样的想法,就像使用文件扫描仪,但我 – 2012-02-13 14:19:43