前提・実現したいこと
java初心者です。
guiを用いてボタンなどを最初から表示させておき、sleep関数を用いて、ランダムな時間を止め、テキストエリアに文字を表示し、音を鳴らしたときに時間を計測するようなプログラムを作っています。現に音は、ビープ音を用いています。
発生している問題・エラーメッセージ
choise関数でモードを選んでもらった後、そのモードに対する関数のgo()メソッドに移動するのですが、goメソッドのなかにスリープ関数を用いて時間を止めています。その時間を止める前にパネルにラベルやテキストエリア、ボタンなどを貼り付けて、setVisible(true)をしています。しかし、setVisibleの後に書いたaaaはパネル表示前に出力されているのに、パネルはsleep完了後まで出力されません。
エラーメッセージはありません。
実行結果は下の通りです
aaa
a
開始時間1582095713153ms
終了時間1582095713621ms
time: 468ms
468
該当のソースコード
ソースコード```java
package final12;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class choise extends JFrame implements ActionListener{
public Container contentPane= getContentPane(); public JTextArea textArea; public JPanel panel; public JButton button1; public JButton button2; public JLabel label; public long start_point; public long end_point; public long time; guia gui; Random random = new Random(); int randomValue = random.nextInt(5)+2; public int T = randomValue * 1000; public choise() { //ウィンドウを作成する setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ウィンドウを閉じるときに,正しく閉じるように設定する setTitle("選択"); //ウィンドウのタイトルを設定する setSize(600,600); //ウィンドウのサイズを設定する JPanel panel = new JPanel(); panel.setLayout(null); panel.setBackground( Color.orange ); JLabel label = new JLabel("どちらのモード?"); textArea = new JTextArea(); panel.add(textArea); textArea.setBounds(100,500,400,30); textArea.setText("クリックで選択せよ"); //label.setBackground( Color.orange ); //ボタンの生成 button1 = new JButton("文字表記あり 音あり"); panel.add(button1);//ペインに貼り付ける button1.setBounds(70,180,200,200);//ボタンの大きさと位置を設定する.(x座標,y座標,xの幅,yの幅) button1.addActionListener(this); button2 = new JButton("文字表記なし 音のみ"); panel.add(button2);//ペインに貼り付ける button2.setBounds(280,180,200,200);//ボタンの大きさと位置を設定する.(x座標,y座標,xの幅,yの幅) button2.addActionListener(this); contentPane.add(panel,BorderLayout.CENTER); contentPane.add(label, BorderLayout.NORTH); this.setVisible(true); } public void actionPerformed(ActionEvent e){ if(e.getSource() == button1){ gui = new guia(); }else if(e.getSource() == button2){ gui = new gui2(); } System.out.println("a"); gui.go(); } public static void main(String[] args) { choise Choise = new choise(); } public static void main(){ choise Choise = new choise(); }
}
package final12;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class guia extends JFrame implements ActionListener{
public Container contentPane= getContentPane(); public JTextArea textArea; public JTextArea textArea2; public JPanel panel = new JPanel();; public JButton button1; public JButton button2; public JLabel label; public long start_point; public long end_point; public long time; Random random = new Random(); int randomValue = random.nextInt(5)+2; public int T = randomValue * 1000; public guia() { //ウィンドウを作成する setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ウィンドウを閉じるときに,正しく閉じるように設定する setTitle("早押し速度計測"); //ウィンドウのタイトルを設定する setSize(600,600); //ウィンドウのサイズを設定する panel.setLayout(null); panel.setBackground( Color.orange ); JLabel label = new JLabel("押せと言ったらクリックせよ"); textArea = new JTextArea(); panel.add(textArea); textArea.setBounds(100,500,400,30); //label.setBackground( Color.orange ); //ボタンの生成 ImageIcon icon1 = new ImageIcon("ose.jpg"); button1 = new JButton(icon1); panel.add(button1);//ペインに貼り付ける button1.setBounds(140,180,290,170);//ボタンの大きさと位置を設定する.(x座標,y座標,xの幅,yの幅) button1.addActionListener(this); contentPane.add(panel,BorderLayout.CENTER); contentPane.add(label, BorderLayout.NORTH); this.setVisible(true); System.out.println("aaa"); } void go() { try { Thread.sleep(T); } catch (InterruptedException e) { e.printStackTrace(); } textArea.setText(" 押せ! "); java.awt.Toolkit.getDefaultToolkit().beep(); start_point = System.currentTimeMillis(); System.out.println("開始時間" + start_point + "ms"); } public void actionPerformed(ActionEvent e){ Container contentPane = getContentPane(); end_point = System.currentTimeMillis(); System.out.println("終了時間" + end_point + "ms"); System.out.println("time: " + (end_point - start_point) + "ms"); time = end_point - start_point; System.out.println(time); textArea.setText("Your Time is " + time + "ms"); } public static void main(String[] args) { guia gui = new guia(); gui.go(); }
}
public class gui2 extends guia{
public void go() {
try {
Thread.sleep(T);
} catch (InterruptedException e) { e.printStackTrace(); } textArea.setText(" "); java.awt.Toolkit.getDefaultToolkit().beep(); start_point = System.currentTimeMillis(); System.out.println("開始時間" + start_point + "ms");
}
}
### 試したこと setVisibleが動いているのか、setvisibleの後に適当なprint文を入れた。 choise関数のgui.goが動いているのか、gui.go()の前に適当なprint文を入れた。 ### 補足情報(FW/ツールのバージョンなど) JavaSE-1.6
回答1件
あなたの回答
tips
プレビュー