JAVAアプレットのクイズのレイアウト

このQ&Aのポイント
  • JAVAのアプレットを用いてクイズを作成しているのですが、問題を1問ごとに回答した後に「次の問題へ」というボタンで画面を切り替えたいです。また、5問終わったら「もう一度」というボタンで再度始められるようにしたいです。
  • 質問文章では、JAVAのアプレットを使用してクイズを作成し、問題を1問ずつ回答して次の問題に進む方法と、5問終了後に再度始められる方法についての方法を教えて欲しいという内容です。
  • アプレットを使用したクイズで、1問ずつ回答して次の問題に進み、5問終了後に再度始められるようにする方法について教えてください。
回答を見る
  • ベストアンサー

JAVAアプレットのクイズのレイアウト。

JAVAのアプレットを用いてクイズを作成しているのですが、下のソースは5問を連続で表示させるものです。 これを1問ごとに回答した後に「次の問題へ」というボタンだけ画面に切り替わり、そのボタンを押すと次の問題が出てくるようにしたいのですが、どのようにしたら良いでしょうか。 また5問終わったら、「もう一度」というボタンだけの画面に切り替わり、そのボタンを押すと、また1問目から始まるようにしたいのですが、どのようにしたら良いでしょうか。 どちらかだけでもいいので、教えてもらえないでしょうか。 import java.applet.*; import java.awt.*; import java.awt.event.*; public class kake extends Applet implements ActionListener{ private Checkbox CB[]; private CheckboxGroup CBG; private Button BT; private Label QL, PL; private Panel P1, P2; private String[][] question = { {"問題1","A","B","C","D","1"}, {"問題2","A","B","C","D","2"}, {"問題3","A","B","C","D","3"}, {"問題4","A","B","C","D","4"}, {"問題5","A","B","C","D","1"}, }; private int rightAns, count; public void init(){ rightAns = Integer.parseInt(question[0][5]); count = 0; CB = new Checkbox[4]; setLayout(new GridLayout(5, 1)); CBG = new CheckboxGroup(); add(QL = new Label(question[0][0])); add(P1 = new Panel(new GridLayout(1, 2))); P1.add(CB[0] = new Checkbox(question[0][1], CBG, true)); P1.add(CB[1] = new Checkbox(question[0][2], CBG, false)); add(P2 = new Panel(new GridLayout(1, 2))); P2.add(CB[2] = new Checkbox(question[0][3], CBG, false)); P2.add(CB[3] = new Checkbox(question[0][4], CBG, false)); add(BT = new Button("答える")); BT.addActionListener(this); BT.setActionCommand("BT"); add(PL = new Label("")); } public void actionPerformed(ActionEvent ae){ try{ if(ae.getActionCommand().compareTo("BT") == 0){ if(CB[rightAns].getState()){ judgement(true); } else{ judgement(false); } setQuestion(); } } catch(Exception e){ PL.setText(e.toString()); } } private void setQuestion(){ QL.setText(question[count][0]); rightAns = Integer.parseInt(question[count][5]); CB[0].setLabel(question[count][1]); CB[1].setLabel(question[count][2]); CB[2].setLabel(question[count][3]); CB[3].setLabel(question[count][4]); repaint(); } private void judgement(boolean ans){ String result; if(ans == true){ result = "正解"; } else{ result = "不正解"; } if(count == 9){ PL.setText(result); } else{ PL.setText(result); count++; } } }

  • Java
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

add(BT = new Button("…")); だと、Appletに追加してません?パネルに追加するのではないですか? パネルを削除してとありますが、 パネルを削除した後に違うパネルを追加するのを忘れてませんか? あと、いちいちパネルを削除したりするのではなく、 CardLayout という切り替えられるレイアウトマネージャがありますので、 そちらを使うのも一考かもしれません。

tale23kaga10wa
質問者

お礼

ご回答ありがとうございます。 またお礼が遅くなってしまいすいません。 パネルに新しいボタンとして追加したいです。 私の考えとして、一度initメソッドで作ったパネルをすべてなくして、新しくパネルを追加する操作を行いたいのですが、前の書いた操作では間違っているのでしょうか。 また質問してしまいすいません。

その他の回答 (3)

回答No.3

ごめんなさい。追加してました。

tale23kaga10wa
質問者

お礼

ご回答ありがとうございます。 removeとaddを使っていったら、解決しました。

回答No.2

それはボタンをnewしただけで、 追加していないからでは?

tale23kaga10wa
質問者

お礼

ご回答ありがとうございます。 removeとaddを使っていったら、解決しました。

回答No.1

>どのようにしたら良いでしょうか。 って言われても >これを1問ごとに回答した後に「次の問題へ」というボタンだけ画面に切り替わり、そのボタンを押すと次の問題が出てくるようにしたいのですが、 って言うんだから、↑のようにしたらいいと思いますよ。 いきなりどうするかを聞くんじゃなくて、 自分なりにやってから、○○なると思ったけど、××になりました。 △△と□□は試しましたが、◎◎と●●になりました。 って感じで質問しましょう。 やりたいけど、できない、どうすればいい? じゃいつまでたっても自分の作りたいものが作れませんよ。

tale23kaga10wa
質問者

お礼

質問の仕方が悪くてすいません。 自分なりに試したのはinitメソッドで指定したパネルをremoveで消し、新しくボタンを設定し、if文でボタンが押されたときに、setQuestionメソッドを呼び出す、というメソッドを作り、そのメソッドを利用して解決しようと思いました。 実際にはこのような感じです。 private void AA(){ remove(PL); remove(QL); remove(P1); remove(P2); remove(BT); add(BT = new Button("次の問題へ")); } しかし、このメソッドを呼び出しても、「次の問題へ」というボタンが出てきませんでした・・。 どうか教えてもらえないでしょうか。

関連するQ&A

  • 4択クイズでのランダム出題の方法。

    JAVAにて4択クイズの作成をしているのですが、下記は5問の問題を連続して表示するプログラムなんですが、これは5問の中から3問をランダムで表示させるようにしたいのですが、どのようにしたら良いのでしょうか。 乱数を使うのも考えたのですが、どのように入れていけばわからないです。よろしければ教えて下さい。 import java.applet.*; import java.awt.*; import java.awt.event.*; public class kake extends Applet implements ActionListener{ private Checkbox CB[]; private CheckboxGroup CBG; private Button BT; private Label QL, PL; private Panel P1, P2; private String[][] question = { {"問題1","A","B","C","D","1"}, {"問題2","A","B","C","D","2"}, {"問題3","A","B","C","D","3"}, {"問題4","A","B","C","D","4"}, {"問題5","A","B","C","D","1"}, }; private int rightAns, count; public void init(){ rightAns = Integer.parseInt(question[0][5]); count = 0; CB = new Checkbox[4]; setLayout(new GridLayout(5, 1)); CBG = new CheckboxGroup(); add(QL = new Label(question[0][0])); add(P1 = new Panel(new GridLayout(1, 2))); P1.add(CB[0] = new Checkbox(question[0][1], CBG, true)); P1.add(CB[1] = new Checkbox(question[0][2], CBG, false)); add(P2 = new Panel(new GridLayout(1, 2))); P2.add(CB[2] = new Checkbox(question[0][3], CBG, false)); P2.add(CB[3] = new Checkbox(question[0][4], CBG, false)); add(BT = new Button("答える")); BT.addActionListener(this); BT.setActionCommand("BT"); add(PL = new Label("")); } public void actionPerformed(ActionEvent ae){ try{ if(ae.getActionCommand().compareTo("BT") == 0){ if(CB[rightAns].getState()){ judgement(true); } else{ judgement(false); } setQuestion(); } } catch(Exception e){ PL.setText(e.toString()); } } private void setQuestion(){ QL.setText(question[count][0]); rightAns = Integer.parseInt(question[count][5]); CB[0].setLabel(question[count][1]); CB[1].setLabel(question[count][2]); CB[2].setLabel(question[count][3]); CB[3].setLabel(question[count][4]); repaint(); } private void judgement(boolean ans){ String result; if(ans == true){ result = "正解"; } else{ result = "不正解"; } if(count == 9){ PL.setText(result); } else{ PL.setText(result); count++; } } }

    • ベストアンサー
    • Java
  • Javaのレイアウトマネージャについてです

    ある課題で、この図のようなレイアウトになければいけないとの指定があるのでやってるんですがhttp://www.dotup.org/uploda/www.dotup.org3826.jpg.html 選択演算子の下のラベル(選択した演算子を表示するもの)がうまくレイアウトできません。ここまでは何とかたどり着いたんですが・・ http://www.dotup.org/uploda/www.dotup.org3828.jpg.html 自分が作ったソースはこちらです。 lb[0] = new JLabel("選択演算子"); lb[1] = new JLabel(" "); lb[2] = new JLabel("0"); lb[3] = new JLabel("です"); lb[0].setHorizontalAlignment(JLabel.LEFT); lb[0].setVerticalAlignment(JLabel.TOP); lb[1].setFont(new Font("Helvetica",Font.BOLD,20)); lb[1].setBorder(new EtchedBorder()); lb[1].setHorizontalAlignment(JLabel.LEFT); lb[1].setVerticalAlignment(JLabel.BOTTOM); lb[2].setFont(new Font("Helvetica",Font.BOLD,20)); lb[2].setBorder(new EtchedBorder()); lb[2].setHorizontalAlignment(JLabel.CENTER); lb[3].setHorizontalAlignment(JLabel.CENTER); bt_en[0] = new JButton("+"); bt_en[1] = new JButton("-"); bt_en[2] = new JButton("="); bt_en[3] = new JButton("C"); bt_en[4] = new JButton("AC"); cnt.setLayout(new GridLayout(3,1)); pn[0].setLayout(new BorderLayout()); pn[1].setLayout(new GridLayout(4,3)); pn[2].setLayout(new FlowLayout()); pn[0].add(lb[0],BorderLayout.WEST); pn[0].add(lb[1],BorderLayout.SOUTH); pn[0].add(lb[2],BorderLayout.CENTER); pn[0].add(lb[3],BorderLayout.EAST); どのようにすればいいのか教えていただきたいです。 ちなみに使っている教科書は「やさしいJava活用編」です。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • java アプレット

    学校の授業でアプレットを学んでいます。 しかし・・・ 下のプログラムで、計算した結果をlabel3にはりつけたいのですが、計算結果がでてくれません・・・ボタンを押しても何もでてきません。 コマンドプロンプトで、エラーはでてきません。 お手数ですが、誰かどこがいけないのか教えて下さい。 import java.awt.*; import java.awt.event.*; public class B extends java.applet.Applet implements ActionListener { Label label3 = new Label(); Button button2 = new Button(); TextField textfield1= new TextField(10); TextField textfield2= new TextField(10); public void init() { button2.setLabel("入力したらクリック!"); button2.setBounds(new Rectangle(50, 465, 120, 20)); this.setLayout(null); label3.setBackground(Color.blue); label3.setBounds(new Rectangle(325, 80, 200, 35)); textfield1.setBounds(100, 425, 100, 25); textfield2.setBounds(150, 350, 100, 25); this.add(textfield2, null); this.add(label3, null); this.add(textfield1, null); this.add(button2, null);} public void actionPerformed(ActionEvent event) {if(event.getSource() == button2) {int diff = Integer.parseInt(textfield1.getText()) - Integer.parseInt(textfield2.getText()); String otsuri; otsuri ="お釣りは"+ diff +"円です。"; label3.setText(otsuri);} }} よろしくお願いします。

    • ベストアンサー
    • Java
  • Java JPanelを使ったコードについての質問です

    Java JPanelを使ったコードについての質問です 4つのTextFieldに数値を入力し、エンターキーが押されたときに円グラフが表示されるプログラムについての質問です。 下記のコードなのですが、何故かエラーが出てしまいます… public class PieCharts extends JPanel implements ActionListener { private JLabel l1, l2, l3, l4; private JTextField t1, t2, t3, t4; private JButton bt; private JPanel pn1,pn2; int h, m, l, n, w, x, y, z; private DrawOvalPane dop; public static void main(String args[]) { JFrame frame = new JFrame("Applet"); frame.setContentPane(new PieCharts()); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } public PieCharts() { dop = new DrawOvalPane(); l1 = new JLabel("High Risk", JLabel.RIGHT); l2 = new JLabel("Medium Risk", JLabel.RIGHT); l3 = new JLabel("Low Risk", JLabel.RIGHT); l4 = new JLabel("No Risk", JLabel.RIGHT); t1 = new JTextField(); t1.addActionListener(this); t2 = new JTextField(); t2.addActionListener(this); t3 = new JTextField(); t3.addActionListener(this); t4 = new JTextField(); t4.addActionListener(this); bt = new JButton("Enter"); pn1 = new JPanel(); pn2 = new JPanel(); pn1.setLayout(new GridLayout(2,4)); pn1.add(l1); pn1.add(t1); pn1.add(l2); pn1.add(t2); pn1.add(l3); pn1.add(t3); pn1.add(l4); pn1.add(t4); pn2.add(bt); setLayout(new BorderLayout()); add("North", pn1); add("Center", dop); add("South", pn2); bt.addActionListener(new SampleActionListener()); }

  • javaの初心者です。

    コンピュータとじゃんけんをするプログラムをつくりたいのですが コンパイルしたところ、次のようなエラーが出てきました。 java:8: メソッドの宣言が不正です。戻り値の型が必要です。 すいませんが、どこをどう直したらいいのかわかりません。 よろしければお教え願います。 以下がプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.AudioClip; class Zyanken extends YJFrame implements ActionListener{ JButton bt1,bt2,bt3; JLabel lb1,lb2,lb3; YJFrame(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ lb2.setText("COMはグーです。"); } else if(com==2){ lb2.setText("COMはチョキです。"); } else{ lb2.setText("COMはパーです。"); } if(e.getSource()==bt1){ if(com==1){ lb3.setText("あいこです。"); } else if(com==2){ lb3.setText("あなたの勝ちです。"); } else{ lb3.setText("あなたの負けです。"); } } else if(e.getSource()==bt2){ if(com==1){ lb3.setText("あなたの負けです。"); } else if(com==2){ lb3.setText("あいこです。"); } else{ lb3.setText("あなたの勝ちです。"); } } else{ if(com==1){ lb3.setText("あなたの勝ちです。"); } else if(com==2){ lb3.setText("あなたの負けです。"); } else{ lb3.setText("あいこです。"); } } } }

  • java applet 上段に2×3、下段に1×3のボタンを作る

    タイトルのようなアプレットを作りたいのですがなぜか実行されません。どこがおかしいのでしょうか? (文字数制限のため省略) { private JButton bt[] = new JButton[9]; private JPanel pn[] = new JPanel[2]; int i; public void init() { Container cnt = getContentPane(); for(i=0; i<9; i++){ add(bt[i] = new JButton("")); } pn[0] = new JPanel(); pn[1] = new JPanel(); //上パネルに置くボタン6つ bt[0].setSize(80,80); bt[0].setLocation(0,0); bt[1].setSize(80,80); bt[1].setLocation(80,0); bt[2].setSize(80,80); bt[2].setLocation(160,0); bt[3].setSize(80,80); bt[3].setLocation(0,80); bt[4].setSize(80,80); bt[4].setLocation(80,80); bt[5].setSize(80,80); bt[5].setLocation(160,80); //下パネルに置くボタン3つ bt[6].setSize(80,80); bt[6].setLocation(0,200); bt[7].setSize(80,80); bt[7].setLocation(80,200); bt[8].setSize(80,80); bt[8].setLocation(160,200); //上パネルと下パネルの作成 pn[0].setLocation(0,0); pn[1].setLocation(0,200); //ボタンをパネルに付ける pn[0].add(bt[0]); pn[0].add(bt[1]); pn[0].add(bt[2]); pn[0].add(bt[3]); pn[0].add(bt[4]); pn[0].add(bt[5]); pn[1].add(bt[6]); pn[1].add(bt[7]); pn[1].add(bt[8]); //コンテナへ追加 cnt.add(pn[0]); cnt.add(pn[1]); } } 座標を指定してボタンを設置する方法にしたいと思っています。 ちなみに完成図はこのような感じにしたいです。 ↓ □□□ □□□ □□□

    • ベストアンサー
    • Java
  • javaアプレット repaintのタイミング

    勉強を始めたばかりなので稚拙な質問ですがお許しください。 ユーザーからの入力→repaint→画面に反映→プログラムが処理→repaint→画面に反映 というターン制のような動かし方をしたいのですが、実際にはユーザーの入力の後、プログラムの処理を待ってからまとめてrepaintしてしまいます。 repaint()は再描画を要求しているだけに過ぎず、repaint()と書いた場所で即時に再描画されるわけではないそうですが、では具体的にすぐ再描画してほしい場合はどうすればいいのでしょうか? 例えばですが、「ボタンを押すとcountの値が+1され、四角がcount個描画される。その一秒後に、こちらが何もしなくてもcountが+2されてもう一度四角がcount個(つまりこの時点で合計三個)描画される」というのを作ってみました。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class question extends Applet implements ActionListener{ Button bt1; int count = 0; public void init(){ bt1 = new Button("start"); add(bt1); bt1.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource() == bt1) { bt1.setEnabled(false); count += 1; repaint(); try { Thread.sleep(1000); } catch (InterruptedException e1) { } count += 2; repaint(); bt1.setEnabled(true); } } public void paint(Graphics g){ for(int i = 0; i < count; i++){ g.drawRect(10, 10, 10 + i * 5, 10 + i * 5); } } } これではボタンを押すたびに3つずつ四角が増えているように外見上見えてしまいます。 ボタンを押すとしっかり1つ四角を表示してから一秒待って、2つ四角を増やす。という風にするためにはどうすればよいのでしょうか? どなたかご教示ください。 ちなみにpaintImmediatelyというものを見つけましたが、何故か使えず……(メソッドpaintImmediatelyは未定義ですと言われてしまう)

    • ベストアンサー
    • Java
  • アプレット初心者です。

    アプレット初心者です。 電卓版もどきを作りたいんですが、お手本を見ながらやったはずなのに、コンパイル時に「main」がないという類のエラーが出ます。 どうすれば正常に動くようになるのか、どなたかご指南いただけませんか? よろしくお願いします。 ↓↓以下がソースです。 import java.awt.*; import javax.swing.*; public class D1 extends JApplet{ private JPanel pn; public init(){ JPanel keyPanel=new JPanel(); keyPanel.setLayout(new GridLayout(4,4)); pn.add(keyPanel,BorderLayout.CENTER); keyPanel.add(new JButton("7"),0); keyPanel.add(new JButton("8"),1); keyPanel.add(new JButton("9"),2); keyPanel.add(new JButton("÷"),3); keyPanel.add(new JButton("4"),4); keyPanel.add(new JButton("5"),5); keyPanel.add(new JButton("6"),6); keyPanel.add(new JButton("×"),7); keyPanel.add(new JButton("1"),8); keyPanel.add(new JButton("2"),9); keyPanel.add(new JButton("3"),10); keyPanel.add(new JButton("-"),11); keyPanel.add(new JButton("AC"),12); keyPanel.add(new JButton("0"),13); keyPanel.add(new JButton("="),14); keyPanel.add(new JButton("+"),15); } }

  • applet

    タイピングを作ってます。これだと、動くのですが入力することができません。どうしたらいいでしょうか。よろしくお願いします。 public void init() { setSize(300,300); setBackground(Color.MAGENTA); for(int i=0; i<26; i++) { chk[i] = 0; // 初期値入力 } flag = 0; // フラグの初期化 setLayout(new BorderLayout()); top = new Panel(); // パネル作成 top.setLayout(new GridLayout(3, 2)); top.add(question = new Label("タイピング 初級")); top.setFont(new Font("MS ゴシック",Font.ITALIC,18)); top.add(q_choice = new Choice()); top.add(stat = new Label("")); q_choice.add("基本"); // 選択ボックスにアイテム追加 q_choice.add("応用"); add(start_btn = new Button(" スタート ")); add(answer = new TextField()); answer.setFont(new Font("MS ゴシック",Font.BOLD,24)); add("North", top); add("South", start_btn); add("Center",answer); start_btn.addActionListener(new ActionListener() { //スタートボタンを押されたときの処理 public void actionPerformed(ActionEvent e) { // if (flag==0) { // flag = 1; typing(); // スレッド開始 // } } }); } public void typing() { TimerA runA = new TimerA(); Thread threadA = new Thread(runA); threadA.start(); boolean flg = true; int count = 0; if (q_choice.getSelectedIndex() == 0){ // 問題判定(指定された項目に一致する、リスト内の最初の項目を返します。) q_data = q_data1; mon = q_data1.length; } else { q_data = q_data2; mon = q_data2.length; } for (int i = 3; i > 0; i--) { // カウントダウン question.setText(""+i); } pt = 0; // 点数初期化 m = (int)(mon * Math.random()); // 1問目の問題決定 ランダムで question.setText(q_data[m]); question.setBackground(new Color(250,128,114)); // 背景色設定 stat.setBackground(new Color(0,206,209)); chk[m] = 1; // 問題のフラグを立てる while(count < 10) { // 問題をまわす time = 6000; if(q_data[m].equals(answer.getText())) { pt += (int)(10000 / (itime - time)); // 点数算出 while(chk[m] != 0) { m = (int)(mon * Math.random()); } chk[m] = 1; question.setText(q_data[m]); //answer.setFont(new Font("MS ゴシック",Font.BOLD,24)); answer.setText(""); } try { threadA.sleep(1000); } catch(InterruptedException e) {} flg = runA.isFlg(); if (flg == false){ count++; runA = new TimerA(); threadA = new Thread(runA); threadA.start(); time -= 10; } // time = runA.getTime(); stat.setText("残り時間 : "+(time/10)+"."+(time%10)+"秒 点数:"+pt+"点"); } question.setText("終了です!お疲れ様でした!"); stat.setText("Time Over! 点数:"+pt+"点"); } } class TimerA implements Runnable { private boolean flg = true; private int time = 6000; public boolean isFlg() { return flg; } public int getTime(){ return time; } public void run() { for(;time > 0; time--) ; flg = false; System.out.println(time); } }

専門家に質問してみよう