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

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

ただいまの
回答率

90.47%

  • Java

    14116questions

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

  • NetBeans

    172questions

    NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します

jLabelのsetTextによって文章が更新されません

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,824

White_green

score 1

前提・実現したいこと

javaにて簡単なクイズゲームのようなものを作っています。
完成形としては、ランダムに問題を抽選、
jLabelに問題数(何問目なのか)、問題文、選択肢を表示し、
jBttonで回答するようなものになる予定です

発生している問題・エラーメッセージ

普通にjlabelにsetTextで文字列を設定しようとしたのですが、
何も変化がありません。
実行できないというわけではないので、エラーメッセージ等はありません。

該当のソースコード

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package quizgame;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author
 */
public class QG_JFrame extends javax.swing.JFrame {

    /**
     * Creates new form QG_JFrame
     */
    public QG_JFrame() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")

**IDEによって自動生成されたコード
文字数が入りきらないので削除
追記する方法があればよいのですが**                

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.out.println("mode="+mode);
        if (mode == 1) {                    //回答可能なモードなら
            System.out.println("button1");
            try {
                Decision(0);                      //番号0で判定に回す
            } catch (InterruptedException ex) {
                Logger.getLogger(QG_JFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (mode == 2) {               //結果表示モードなら
            award();                           //続行判定
        }
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.out.println("mode="+mode);
        if (mode == 1) {                    //回答可能なモードなら
            System.out.println("button2");
            try {
                Decision(1);                      //番号1で判定に回す
            } catch (InterruptedException ex) {
                Logger.getLogger(QG_JFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (mode == 2) {               //結果表示モードなら
            award();                           //続行判定
        }
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        System.out.println("mode="+mode);
        if (mode == 1) {                    //回答可能なモードなら
            System.out.println("button3");
            try {
                Decision(2);                      //番号2で判定に回す
            } catch (InterruptedException ex) {
                Logger.getLogger(QG_JFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (mode == 2) {               //結果表示モードなら
            award();                           //続行判定
        }
    }                                        

    /**
     * @param args the command line arguments
     */
    public void main() {
        /* Set the Nimbus look and feel */

**上と同じ理由で削除**

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new QG_JFrame().setVisible(true);
            }
        });
        try {
            proposing();
        } catch (InterruptedException ex) {
            Logger.getLogger(QG_JFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void proposing() throws InterruptedException {
        System.out.println("QG_JFrame/proposing");//デバッグ用メッセージ
        mode = 0;           //操作禁止モードに変更

        if (QCount == 0) {
            setQuestion();                      //問題を設定
        }

        QCount++;
        System.out.println("settext");//デバッグ用メッセージ
        counter.setText(String.valueOf(QCount));           //出題中の問題を表示

        while (true) {                                                      //出題する問題を決めるため無限ループ
            System.out.println("roop");//デバッグ用メッセージ
            rnd = (int) (Math.random() * 問題数);//出題する問題を抽選
            Thread.sleep(10);
            if (!question[rnd].getRead()) {                                // 問題が出題済みでないなら
                break;                                                      //問題決定でループ脱出
            }
        }

        String k = question[rnd].getQuestion();                 //選ばれた問題の問題文を取得
        System.out.println(k);//デバッグ用メッセージ
        main.setText(k);           //問題文を表示
        String s[] = question[rnd].getChoices();                  //選択肢(String[])を取得
        System.out.println(s[0] + s[1] + s[2]);//デバッグ用メッセージ
        S1.setText(s[0]);                                           //********************//
        S2.setText(s[1]);                                           //選択肢を表示
        S3.setText(s[2]);                                           //********************//
        System.out.println("settext");//デバッグ用メッセージ
        mode = 1;                                                    //回答可能なモードに変更
        System.out.println("回答開始");//デバッグ用メッセージ
    }

    private int rnd = 0;
    private int mode;                                            //モードを管理する変数
    private int QCount = 0;                                             //出した問題の数を管理する変数
    private final int 問題数 = 3;
    private Question question[]=new Question[問題数];

    void setQuestion() throws InterruptedException {
        for(int i=0;i<question.length;i++){
            question[i]=new Question();//question(Question[])をすべてnew
            Thread.sleep(10);
        }
        System.out.println("QG/setQuestion");//デバッグ用メッセージ
        /*問題追加ひな形
        choices[0]="選択肢正解";
        choices[1]="選択肢不正解";
        choices[2]="選択肢不正解";
        question[数字(順番に並ぶように)].setQuestion("問題文",A);*/

        String choices[]=new String[問題数];

        choices[0]="A";
        choices[1]="B";
        choices[2]="B";
        question[0].setQuestion("A", choices);

        choices[0]="B";
        choices[1]="C";
        choices[2]="C";
        question[1].setQuestion("B", choices);

        choices[0]="C";
        choices[1]="D";
        choices[2]="D";
        question[2].setQuestion("C", choices);
        return;
    }

    void Decision(int n) throws InterruptedException {
        System.out.println("QG_JFrame/Decision");
        mode = 0;                                                         //操作禁止モードに変更

        if (question[rnd].getCorrect() == n) {                           //引数とgetCorrectで正解かを判別
            main.setText("<html><br>正解<html/>");  // 正解時のメッセージを表示
        } else {
            main.setText("<html><br>はずれ<html/>");//はずれ時のメッセージを表示
        }

        mode = 2;                                                           //回答表示モードに移行
    }

    void award() {
        System.out.println("QG_JFrame/award");
        if (問題数 == QCount) {
            main.setText("<html><br>問題終了<html/>");
        } else {
            try {
                proposing();
            } catch (InterruptedException ex) {
                Logger.getLogger(QG_JFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel S1;
    private javax.swing.JLabel S2;
    private javax.swing.JLabel S3;
    private static javax.swing.JLabel counter;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private static javax.swing.JLabel main;
    // End of variables declaration                   
}

上のclassは別のclassから呼び出す仕組みですが、呼び出すだけのclassなため省略

上のコードに出てきたQuestionクラスなのですが、
文字数制限のため削除
追記する方法があればよいのですが


長くなってしまい、申し訳ありません。

試したこと

sleep関係の不具合は前に経験があったので、
Thread.sleep();を試してみました。
その結果、jLabelの
mainとcounterは正常に表示が更新されるようになりました。
ですが、S1,S2,S3(それぞれ選択肢の表示に使う)は
何も変化がありませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

java jdk 1.8.0_91
IDE  netbeans 8.1

初歩的な質問かとは思いますが、回答いただけると幸いです。
(みなさん文字数制限どうしていらっしゃるのでしょうか…)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

JavaFXアプリケーションに処理だけ移植したら動きました
根本的な解決には至っていませんが、とりあえず動いたのでよしとします。
原因追及はいつかやります

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コードを見ても私にはわからなかったので、アドバイスだけ。
まず、JLabelがちゃんと表示されているか確認してください。
中にある文字列(s[])がちゃんと存在するならば、setText()で表示されているはずです。
JPanelなどは使っていないようなので、add(S1);でJFrameに追加されているかどうかや、borderを設定して、大きさや位置を視認できるようにしてみたりしてください。

あと、どうでもいいですが、import文を使うともっと楽に書けますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/02 13:12

    JLabelの存在自体は、borderを設定することで確認できました。
    また、s[]についてもコンソールに出力はできているので、文字列の取得はうまくいっていると思います。
    この問題が解決したらimport文も試してみようと思います

    キャンセル

0

//
        /*問題追加ひな形
        choices[0]="選択肢正解";
        choices[1]="選択肢不正解";
        choices[2]="選択肢不正解";
        question[数字(順番に並ぶように)].setQuestion("問題文",A);*/

        String choices[]=new String[問題数];

        choices[0]="A";
        choices[1]="B";
        choices[2]="B";
        question[0].setQuestion("A", choices);

        choices[0]="B";
        choices[1]="C";
        choices[2]="C";
        question[1].setQuestion("B", choices);

        choices[0]="C";
        choices[1]="D";
        choices[2]="D";
        question[2].setQuestion("C", choices);


Questionを3つ作成し、選択肢を3種類×3作っているおつもりでしょうが、現状、setQuestion()で選択肢配列のコピーをしているのでなければ3問とも同じ選択肢の配列を参照している事になります。
問題Aの選択肢をセットしたあと、同じ配列に選択肢を設定すると、その配列を参照している問題Aから選択肢を見ても更新された状態になってしまうのです。なので、このコードの場合、どの問題の選択肢も[C, D, D]という状態になっていると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/02 12:57

    ご指摘の部分については、ありがとうございます。
    確かに、同じ変数を使いまわす例は見たことありませんでした。
    とりあえず動作確認のためにその辺は適当だったので…
    改善しておきます。

    キャンセル

  • 2016/05/02 13:04

    「文章が更新されない」というのは、実は全く同じ文章を表示しているからだと推測したのですが違うのですか?問題文すら更新されないということでしょうか?

    キャンセル

  • 2016/05/02 23:13

    すみません、こちらの書き方が悪かったですね。
    最初は何も表示していない状態かつ、文字列は正常に取得できているので、
    まったく同じ文章を表示しようとしているわけではないです。
    「更新されない」と書いたのは、JLabelに最初から文字列を設定していても
    表示が変わらないからです。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14116questions

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

  • NetBeans

    172questions

    NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します