4

我是java的新手。我现在面临问题。我的目的是将时间放在文本字段中。我需要按“开始”按钮,然后时间就会开始走。但是在我编译这段代码之后。它出错了。我不知道该怎么做。有谁能够帮助我?谢谢大家!!

错误

I:\PlayScene.java:108: cannot find symbol
symbol: variable buttonPlay
                buttonPlay.setText(Play);
                ^
I:\PlayScene.java:111: cannot find symbol
symbol: variable buttonPlay
                buttonPlay.setText(Pause);
                ^
I:\PlayScene.java:103: cannot find symbol
symbol  : variable buttonPlay
location: class PlayScene
    buttonPlay.addActionListener(new ActionListener() {
    ^
3 errors

代码

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

public class PlayScene extends JFrame implements ActionListener{

//declaration for time 
private static final String Play = "Play";
private static final String Pause = "Pause";
private Timer timer = new javax.swing.Timer(100, this);
private long initTime = System.currentTimeMillis();
private long startTime;
private long pauseTime;
private boolean isRunning;

public void start() {
  if (isRunning == false) {
      startTime = System.currentTimeMillis();
    } else {
       startTime = System.currentTimeMillis() - (pauseTime - startTime);
    }

    isRunning = true;
    timer.start();
 }

 public void pause() {           
    pauseTime = System.currentTimeMillis();
    timer.stop();
}
   private String getCurrentTime(long time) {
    return myFormat(time);
}

private String myFormat(final long time) {
    final long hr = TimeUnit.MILLISECONDS.toHours(time);
    final long min = TimeUnit.MILLISECONDS.toMinutes(time
            - TimeUnit.HOURS.toMillis(hr));
    final long sec = TimeUnit.MILLISECONDS.toSeconds(time
            - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
    final long ms = TimeUnit.MILLISECONDS.toMillis(time
            - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min)
            - TimeUnit.SECONDS.toMillis(sec));
    return String.format("%02d:%02d:%02d.%01d", hr, min, sec, ms/100);
}

public PlayScene(){

    super("Memory Game");
    setBounds(300,40,800,600);

    final JButton buttonPlay = new JButton(Play);

    //create label
    JLabel labelTimer = new JLabel("Timer");

    JTextField text2 = new JTextField(15); 
    text2.setEnabled(false);
    text2.setText(getCurrentTime(System.currentTimeMillis() - initTime));

    //Labels for upper 
    JLabel up = new JLabel();
    //JLabel space = new JLabel("\n");

    //Label for left
    JLabel left = new JLabel();
    JLabel space1 = new JLabel("                           ");

    //Label for right
    JLabel right = new JLabel();
    JLabel space2 = new JLabel("                            ");

    //create up panel 
    final JPanel upPanel = new JPanel(new FlowLayout());
    upPanel.add(labelTimer);
    upPanel.add(text2);

    JPanel bottomPanel = new JPanel(new FlowLayout());
    bottomPanel.add(buttonPlay);

    JPanel leftPanel = new JPanel(new FlowLayout());
    leftPanel.add(space1);

    JPanel rightPanel = new JPanel(new FlowLayout());
    rightPanel.add(space2);

    add(upPanel,BorderLayout.NORTH);
    add(bottomPanel,BorderLayout.SOUTH);
    add(leftPanel, BorderLayout.WEST);
    add(rightPanel,BorderLayout.EAST);  

    setVisible(true);
}

public void actionPerformed(ActionEvent e) {

    buttonPlay.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            if (Pause.equals(cmd)) {
                pause();
                buttonPlay.setText(Play);

           } else {
                buttonPlay.setText(Pause);
                start();
            }
        }
    });        
}

public static void main(String[] args) {
    JFrame frame = new PlayScene();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
}
4

2 回答 2

5

的范围buttonPlay仅限于PlayScene构造函数的长度,因此无法在其他方法中访问。要解决它,请将其设为类属性。

于 2012-05-18T09:47:56.477 回答
3

您的代码中存在一些问题。我建议你这样做(作为快速更正):

public class PlayScene extends JFrame {

//declaration for time 
private static final String Play = "Play";
private static final String Pause = "Pause";
private Timer timer;
private long initTime = System.currentTimeMillis();
private long startTime;
private long pauseTime;
private boolean isRunning;

public void start() {
    if (!isRunning) {
        startTime = System.currentTimeMillis();
    } else {
        startTime = System.currentTimeMillis() - (pauseTime - startTime);
    }

    isRunning = true;
    timer.start();
}

public void pause() {
    pauseTime = System.currentTimeMillis();
    timer.stop();
}

private String getCurrentTime(long time) {
    return myFormat(time);
}

private String myFormat(final long time) {
    final long hr = TimeUnit.MILLISECONDS.toHours(time);
    final long min = TimeUnit.MILLISECONDS.toMinutes(time - TimeUnit.HOURS.toMillis(hr));
    final long sec = TimeUnit.MILLISECONDS.toSeconds(time - TimeUnit.HOURS.toMillis(hr)
            - TimeUnit.MINUTES.toMillis(min));
    final long ms = TimeUnit.MILLISECONDS.toMillis(time - TimeUnit.HOURS.toMillis(hr)
            - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
    return String.format("%02d:%02d:%02d.%01d", hr, min, sec, ms / 100);
}

public PlayScene() {
    super("Memory Game");
    setBounds(300, 40, 800, 600);

    final JButton buttonPlay = new JButton(Play);

    JLabel labelTimer = new JLabel("Timer");

    final JTextField text2 = new JTextField(15);
    text2.setEnabled(false);
    text2.setText(getCurrentTime(System.currentTimeMillis() - initTime));

    JLabel up = new JLabel();

    JLabel left = new JLabel();
    JLabel space1 = new JLabel("                           ");

    JLabel right = new JLabel();
    JLabel space2 = new JLabel("                            ");

    final JPanel upPanel = new JPanel(new FlowLayout());
    upPanel.add(labelTimer);
    upPanel.add(text2);

    JPanel bottomPanel = new JPanel(new FlowLayout());
    bottomPanel.add(buttonPlay);

    JPanel leftPanel = new JPanel(new FlowLayout());
    leftPanel.add(space1);

    JPanel rightPanel = new JPanel(new FlowLayout());
    rightPanel.add(space2);

    add(upPanel, BorderLayout.NORTH);
    add(bottomPanel, BorderLayout.SOUTH);
    add(leftPanel, BorderLayout.WEST);
    add(rightPanel, BorderLayout.EAST);

    setVisible(true);

    buttonPlay.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            if (Pause.equals(cmd)) {
                pause();
                buttonPlay.setText(Play);

            } else {
                buttonPlay.setText(Pause);
                start();
            }
        }
    });

    timer = new Timer(100, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    text2.setText(getCurrentTime(System.currentTimeMillis() - initTime));
                }
            });
        }
    });
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new PlayScene();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

}

基本上你需要:

  • buttonPlay 的正确范围
  • javax.swing.Timer使用自己的侦听器正确初始化(不是您的按钮侦听器)
  • 始终使用 SwingUtilities - 当您需要更新或创建 Swing 组件并且运行不在 Swing EDT 中的代码时

"Decorative" issues: * you should also declare static constants as upper-case

于 2012-05-18T09:54:43.750 回答