「アナウンサー」に JTextArea での操作の結果をアナウンスしてもらいたいという学習目的で、非常に単純な電卓を作成しました。このプログラムの目的は、大学で学んだことを活用することです。runnable を実装して calc オブジェクトを同期する独自のアナウンス クラスがあり、結果を追加するはずですが、何も起こりません。
プログラムは正常に動作しているので、コードを関連する部分に取り除きました。
アナウンサー クラス内の run メソッド:
public void run()
{
calc.getAnnouncementJTF().append("Announcer thread has been initialized...\n");
calc.getAnnouncementJTF().append("Hi. My name is " + this.getName() + " and my purpose is to " +
"announce the results of your operations as soon as they are ready. \r\n");
while(true){
synchronized(calc){
try
{
calc.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
calc.getAnnouncementJTF().append(String.valueOf(calc.getResult() + "\n"));
}
}
そして、計算を実行し、待機中のすべてのオブジェクトに通知する条件は次のとおりです。
else if(e.getSource() == sumButton && Numbers.size() != 0)
{
if(!actualNumber.getText().equals("")){
Numbers.add(new Double(actualNumber.getText()));
addToResults = previousNumbers.getText() + " " + actualNumber.getText();
} else {
addToResults = previousNumbers.getText().substring(0, previousNumbers.getText().length() - 2);
}
currentResult = performCalculation(Numbers, Operators);
previousCalcs.append(addToResults + " = " + String.valueOf(currentResult) + "\r\n");
// Clear both lists and add the result to a cleared
// list for further calculation on it.
Operators.clear();
Numbers.clear();
actualNumber.setText(String.valueOf(currentResult));
previousNumbers.setText("");
resultExist = true;
synchronized(this){
notifyAll();
}
}
主な方法
public static void main(String[] args){
Announcer announcer = new Announcer();
Calculator calc = new Calculator(announcer);
calc.setTitle("Calculator");
calc.setSize(360, 900);
calc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
calc.setLocationRelativeTo(null);
calc.setVisible(true);
calc.setResizable(false);
announcer.setCalculator(calc); announcer.setName("Sam");
announcer.setAge(28); announcer.setLength(182.5);
Thread announcerThread = new Thread(announcer);
announcerThread.start();
}
前に述べたように、コードは正常に実行されています。唯一の問題は、アナウンサー クラスの run メソッドのこの部分が実行されないことです。
calc.getAnnouncementJTF().append(String.valueOf(calc.getResult() + "\n"));