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 ではないコードを実行している場合

「装飾的」問題: * 静的定数も大文字で宣言する必要があります

于 2012-05-18T09:54:43.750 に答える