显示不变

时间:2018-05-16 22:34:42

标签: java arrays

我正在研究这个程序,当你点击按钮时,它会计算每分钟的节拍数(BPM)。当您单击两次时,它应该显示当前的BPM,然后在每次单击后显示新的BPM。但问题是显示器没有变化。我需要做什么?

这是我的代码:

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

public class BPM extends JPanel implements ActionListener {
    JLabel label;
    public String display;
    public int bpm;
    public int buttonPressed;
    public int time1;
    public int time2;
    public int time3;
    public int counter[];

    public void addComponents(Container pane) {
        JPanel buttons = new JPanel();

        JButton bpmButton = new JButton("Click");
        bpmButton.setSize(new Dimension(100, 50));
        bpmButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                buttonPressed++;
                counter = new int[2];
                if (buttonPressed == 1) {
                    counter[0] = (int)(System.currentTimeMillis());
                }   else if (buttonPressed == 2) {
                    counter[1] = (int)(System.currentTimeMillis());
                    calculateTimeBetweenClicks();
                    setTime();
                }   else {
                    counter[0] = counter[1];
                    counter[1] = (int)(System.currentTimeMillis());
                    calculateTimeBetweenClicks();
                    setTime();
                }
            }
        });

        display = "0";
        label = new JLabel(display, SwingConstants.CENTER);
        label.setFont(label.getFont().deriveFont(100.0f)); // original 45

        pane.add(label, BorderLayout.PAGE_START);
        pane.add(bpmButton, BorderLayout.CENTER);
    }

    // Calculates the difference between the two saved clicks
    public void calculateTimeBetweenClicks() {
        if (buttonPressed == 1) {
            time1 = counter[0];
        } else {
            time1 = counter[0];
            time2 = counter[1];
        }
        time3 = time2 - time1;
    }

    // Calculates the BPM and changes the display accordingly
    public void setTime() {
        bpm = 60000 / time3;
        display = "" + bpm + "";
        label.setText(display);
    }

    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }

    public static void createAndShowGUI() {
        // Creates the window
        JFrame frame = new JFrame("BPM Calculator");
        frame.setPreferredSize(new Dimension(300, 200)); // original (250, 130)
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Adds the components to the content pane
        BPM window = new BPM();
        window.addComponents(frame.getContentPane());

        //Displays the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // Turns off bold text
        UIManager.put("swing.boldMetal", Boolean.FALSE);

        // Allows the components to be used and interacted with
        java.awt.EventQueue.invokeLater(new Runnable() {
             public void run() {
                createAndShowGUI();
             }
        });
    }

}

1 个答案:

答案 0 :(得分:1)

问题在于你的 addComponents 方法,你在每次点击按钮时都会创建一个新数组(所以最终得到一个新的空数组)。这会使你的计算失败。只需将数组的实例化移动到ActionListener之外的某个位置,就像这样...

public void addComponents(Container pane) {
    JPanel buttons = new JPanel();
    counter = new int[2]; //Move this line to here...
    JButton bpmButton = new JButton("Click");
    bpmButton.setSize(new Dimension(100, 50));
    bpmButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            buttonPressed++;                
            if (buttonPressed == 1) {
                counter[0] = (int)(System.currentTimeMillis());
            }   else if (buttonPressed == 2) {
                counter[1] = (int)(System.currentTimeMillis());
                calculateTimeBetweenClicks();
                setTime();
            } //Removed the else - see edit below :-)
        }
    });

其他

在第二次点击(第一次BPM计算)之后,您的代码似乎变得混乱,因为如果您理解我的意思,它似乎将第二次点击视为下一组2次点击的第一次点击。我不确定这是否是预期的行为,但如果没有,我会在你为一组新的2次点击计算出正确的bpm后,重置 calculateTimeBetweenClicks 方法中的所有内容...

 // Calculates the difference between the two saved clicks
public void calculateTimeBetweenClicks() {
    if (buttonPressed == 1) {
        time1 = counter[0];
    } else {
        time1 = counter[0];
        time2 = counter[1];
        //Reset here ready for next 2 clicks...
        counter[0]=0;
        counter[1]=0;
        buttonPressed = 0;
    }
    time3 = time2 - time1;
}