質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

button

HTMLで用いる<button>タグです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

2642閲覧

java gui setVisible(true)をしてもウインドウが真っ白なまま

aoi1188

総合スコア5

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

button

HTMLで用いる<button>タグです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/02/19 07:04

編集2020/02/19 07:31

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/02/19 07:17

コードは, 入力欄の上辺にある "<code>" を押して出てくる ``` に挟まれた "コード" という文字列を置き換える形で入力(コピペ)してください. 専用の枠に表示されるようになり, インデント(字下げ)がきちんと表示されるようになります. また, ``` の右にある "ここに言語を入力" をその言語 ("java") に置き換えますと, それに合わせてキーワードのフォントが変わって読み易くなります. 入力欄の下にプレビューがあるはずですので, 確認してみてください.
guest

回答1

0

ベストアンサー

Swing のイベント処理はシングルスレッドです.
actionPerformed メソッドが終わらない限り, actionPerformed メソッド内で実行した Swing に関する表示等は行われません.


時間を計り終わった後の処理("再実行"ボタンや"戻る"ボタン?)が無かったり, ボタン連打が出来たりと不足部分はありますが, 一応動作します.
MainFrame.java

java

1import java.awt.*; 2import java.awt.event.*; 3import java.util.Random; 4 5import javax.swing.*; 6 7public class MainFrame extends JFrame { 8 public MainFrame() { 9 super("選択"); 10 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 11 setSize(600,600); 12 13 Container contentPane= getContentPane(); 14 15 JLabel label = new JLabel(""); 16 //label.setBackground( Color.orange ); 17 contentPane.add(label, BorderLayout.NORTH); 18 19 CardLayout layout = new CardLayout(); 20 JPanel panel = new JPanel(layout); 21 22 ChoisePanel choisePanel = new ChoisePanel(); 23 panel.add(choisePanel, "ChoisePanel"); 24 25 ClickPanel clickPanel = new ClickPanel(); 26 panel.add(clickPanel, "ClickPanel"); 27 28 contentPane.add(panel,BorderLayout.CENTER); 29 30 choisePanel.setOnChoiseListener(new ChoisePanel.OnChoiseListener() { 31 @Override 32 public void onChoise(int no) { 33 ClickPanel.TextMode mode = no == 1 ? ClickPanel.TextMode.ON : ClickPanel.TextMode.OFF; 34 setTitle("早押し速度計測"); 35 label.setText("押せと言ったらクリックせよ"); 36 layout.show(panel, "ClickPanel"); 37 clickPanel.go(mode); 38 } 39 }); 40 41 label.setText("どちらのモード?"); 42 } 43 44 static class ChoisePanel extends JPanel { 45 interface OnChoiseListener { 46 /** 47 * @param no 1 or 2. 48 */ 49 void onChoise(int no); 50 } 51 private OnChoiseListener listener; 52 ChoisePanel() { 53 super(null); 54 setBackground(Color.orange); 55 56 JTextArea textArea = new JTextArea(); 57 textArea.setBounds(100,500,400,30); 58 textArea.setText("クリックで選択せよ"); 59 add(textArea); 60 61 //ボタンの生成 62 JButton button1 = new JButton("文字表記あり 音あり"); 63 button1.setBounds(70,180,200,200); 64 button1.addActionListener(new ActionListener() { 65 @Override 66 public void actionPerformed(ActionEvent e) { 67 if(listener != null) listener.onChoise(1); 68 } 69 }); 70 add(button1); 71 72 JButton button2 = new JButton("文字表記なし 音のみ"); 73 button2.setBounds(280,180,200,200); 74 button2.addActionListener(new ActionListener() { 75 @Override 76 public void actionPerformed(ActionEvent e) { 77 if(listener != null) listener.onChoise(2); 78 } 79 }); 80 add(button2); 81 } 82 void setOnChoiseListener(OnChoiseListener listener) { 83 this.listener = listener; 84 } 85 } 86 87 static class ClickPanel extends JPanel { 88 enum TextMode { 89 ON, OFF 90 }; 91 private long start_point; 92 private JTextArea textArea; 93 private boolean flag; 94 95 public ClickPanel() { 96 super(null); 97 setBackground(Color.orange); 98 99 textArea = new JTextArea(); 100 textArea.setBounds(100,500,400,30); 101 add(textArea); 102 103 //ボタンの生成 104 JButton button = new JButton(new ImageIcon("ose.jpg")); 105 button.setBounds(140,180,290,170); 106 button.addActionListener(new ActionListener() { 107 @Override 108 public void actionPerformed(ActionEvent e){ 109 if(!flag) return; 110 111 long end_point = System.currentTimeMillis(); 112 System.out.println("終了時間" + end_point + "ms"); 113 System.out.println("time: " + (end_point - start_point) + "ms"); 114 long time = end_point - start_point; 115 System.out.println(time); 116 textArea.setText("Your Time is " + time + "ms"); 117 flag = false; 118 } 119 }); 120 add(button); 121 } 122 123 void go(TextMode mode) { 124 flag = false; 125 Random random = new Random(System.currentTimeMillis()); 126 int delay = (random.nextInt(5)+2)*1000; 127 Timer timer = new Timer(delay, new ActionListener() { 128 @Override 129 public void actionPerformed(ActionEvent e) { 130 if(mode == TextMode.ON) textArea.setText(" 押せ! "); 131 java.awt.Toolkit.getDefaultToolkit().beep(); 132 start_point = System.currentTimeMillis(); 133 System.out.println("開始時間" + start_point + "ms"); 134 flag = true; 135 } 136 }); 137 timer.setRepeats(false); 138 timer.start(); 139 } 140 } 141 142 public static void main(String[] args) { 143 new MainFrame().setVisible(true); 144 } 145}

投稿2020/02/19 07:30

編集2020/02/19 10:08
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoi1188

2020/02/19 07:34

では、マルチスレッド化し、sleepを実装すればできますかね?
jimbe

2020/02/19 10:04

わざわざ別スレッドを立ち上げずとも, 遅延処理を行える Timer がありますので, それを用いてできます.
aoi1188

2020/02/19 13:15

ありがとうございます 自分の知識不足を感じました 完成させられるように頑張ります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問