-1
私はJavaでストップウォッチを作ろうとしています。スレッド間のマルチスレッドと変数の転送
私の最初の問題は、46行目で新しいスレッドでtimerMethodを開始する必要があることですが、その方法を理解できませんでした。
第2の問題は、44行目、45行目および53行目に「ローカル変数isTimingが囲みスコープで定義されていなければなりません」というエラーがあることです。
コード:
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Stopwatch {
public static void main(String[] args) {
windowMethod();
}
public static void windowMethod() {
//create frame
JFrame frame = new JFrame();
frame.setSize(900, 600);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
//create panel
JPanel panel = new JPanel();
frame.add(panel);
panel.setLayout(null);
//create time label
JLabel timeLabel = new JLabel("00:00:00");
panel.add(timeLabel);
timeLabel.setFont(new Font("Tahoma",Font.PLAIN, 32));
Dimension timeLabelSize = timeLabel.getPreferredSize();
int timeLabelx = (450-(timeLabelSize.width/2));
timeLabel.setBounds(timeLabelx, 50, timeLabelSize.width, timeLabelSize.height);
//create start/stop button
JButton startStopButton = new JButton("Start Timer");
panel.add(startStopButton);
startStopButton.setFont(new Font("Tahoma",Font.PLAIN, 32));
Dimension startStopButtonSize = startStopButton.getPreferredSize();
int startStopButtonx = (450-(startStopButtonSize.width/2));
startStopButton.setBounds(startStopButtonx, 150, startStopButtonSize.width, startStopButtonSize.height);
boolean isTiming = false;
startStopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isTiming = false) { //This runs if the button is clicked to start the timer
isTiming = true;
timerMethod(isTiming); //runs the timerMethod in a new thread?
startStopButton.setText("Stop Timer");
Dimension startStopButtonSize = startStopButton.getPreferredSize();
int startStopButtonx = (450-(startStopButtonSize.width/2));
startStopButton.setBounds(startStopButtonx, 150, startStopButtonSize.width, startStopButtonSize.height);
}
else { //This runs if the button is clicked to stop the timer
isTiming = false;
startStopButton.setText("Start Timer");
Dimension startStopButtonSize = startStopButton.getPreferredSize();
int startStopButtonx = (450-(startStopButtonSize.width/2));
startStopButton.setBounds(startStopButtonx, 150, startStopButtonSize.width, startStopButtonSize.height);
}
}
});
}
public static String timerMethod(boolean isTiming) {
int milliseconds = 0;
int seconds = 0;
int minutes = 0;
while(isTiming = true) {
milliseconds++;
if (milliseconds > 999) {
milliseconds = 0;
seconds++;
if (seconds > 59) {
seconds = 0;
minutes++;
}
}
}
String outputTime = (minutes + ":" + seconds + ":" + milliseconds);
return outputTime;
}
}
[スレッドで実行](https://stackoverflow.com/questions/3489543/how-to-call-a-method-with-a-separate-thread-in-java)と[ローカル変数を解決するスコープの問題](https://stackoverflow.com/questions/25894509/problems-with-local-variable-scope-how-to-solve-it) – KernelMode
[Javaの別スレッドでメソッドを呼び出す方法?](https://stackoverflow.com/questions/3489543/how-to-call-a-method-with-a-separate-thread-in-java) –