• 締切済み

javaの質問です ボタンを右、左クリックすることでswitch文を切

javaの質問です ボタンを右、左クリックすることでswitch文を切り替えたいのですがどうすればいいでしょうか?できれば直接以下のプログラムを直してしまってください。 import java.awt.*; import java.awt.image.*; import java.util.*; import java.util.Timer; public class MojiTest0817 { JFrame frame1; BufferStrategy bstrategy; MojiTest0817(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),2,15); } public static void main(String args[]){ MojiTest0817 gtm =new MojiTest0817(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; //表示する文字列の配列 String[] messages = { "あelloWorlハローワールド", "あいうあいうあいう", "年収うううう万円の米市職員退職"}; String[] messages2 = { "あんかけちゃーはん", "回答が寄せられるよう、以下を参考にたち", "2教えて!goo では"}; @Override public void run() { int sen=1; Graphics g = bstrategy.getDrawGraphics(); switch(sen){ case 1: if(bstrategy.contentsLost()==false){ System.out.println(messages[line].substring(0,position)); if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); break; case 2: Graphics g2 = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ System.out.println(messages[line].substring(0,position)); if(position < messages2[line].length()){ position += 1; }else if(line == messages2.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); break; } } } }

  • Java
  • 回答数3
  • ありがとう数1

みんなの回答

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

> マウスリスナーは範囲が指定できますか? > (100,100)から(200,200)の範囲でクリックされたときのみ反応するような 気持ちは分かるけど どちらかというとロジック的には クリックポイントが(100,100)から(200,200)の範囲にあるかどうかを 判定するべきじゃないかしらね。 もしくは、(100,100)から(200,200)の範囲に マウスリスナーを実装したコンポーネントを置くべきね。

arinkoZ
質問者

補足

なるほど mouseClickedでPointを使って座標を調べて判定すればいいわけですか

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

> TimerTaskが最初止まっている(止まらせるようなプログラムも欲しい)状態のときに Timerは登録されたタスクを ひたすら繰り返すだけよ。 つまり、実行したくなければTimerに登録しなければいいの。

arinkoZ
質問者

補足

なるほど マウスリスナーは範囲が指定できますか?(100,100)から(200,200)の範囲でクリックされたときのみ反応するような

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

ボタンってマウスのボタン? だとすれば MouseListenerとMouseEventを使えば 右クリック、左クリックが拾えるわ。 キーボードならKeyListenerとKeyEventよ。

arinkoZ
質問者

補足

ええ。そこまでは分かるんですけど、TimerTaskが最初止まっている(止まらせるようなプログラムも欲しい)状態のときに、MouseListenerでクリックしたら、runのところをstartさせたいのです。

関連するQ&A

  • javaの質問ですdrawStringを使いゲームのオートモードの文字

    javaの質問ですdrawStringを使いゲームのオートモードの文字を描写しているのですが、そのオートモードに描画される文字とふり仮名を同じタイミングで描写するプログラムを打ちたいのですがどうすればよろしいでしょうか? できればループを抜ける方法もお願いします。初心者質問ですみません。 import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class test0725 { JFrame frame1; BufferStrategy bstrategy; test0725(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),10,50); } public static void main(String args[]){ test0725 gtm =new test0725(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "Hello新着メッセージなしを読む", "aaa", "年収7000万円の米市職員退職" }; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); for(int i = 0;i < line ;i++){ //g.drawString(messages[i], 200,500 + 40 * i); } System.out.println(messages[line].substring(0,position)); g.drawString(messages[line].substring(0,position), 200,500 + 40 * line); if(line==2){ line=0; } if(line==1){ g.drawString("ありがとう", 50, 50); } if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); g.dispose(); } } }

  • index0920さん

    index0920さん javaの質問です なぜ以下のプログラムがループするのかがわかりません 文字列を全文出し切った時点でとめたいのですがどうすればいいでしょうか? 方法と解説をおねがいします。 import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; import java.util.concurrent.TimeUnit; public class MojiTest0730 { JFrame frame1; BufferStrategy bstrategy; MojiTest0730(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),30,150); } public static void main(String args[]){ MojiTest0730 gtm =new MojiTest0730(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "Hello、Worldハローワールド", "aaa", "年収7000万円 の米市職員退職"}; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); g.drawString(messages[line].substring(0,position), 200,500 + 40 * line); System.out.println(messages[line].substring(0,position)); if((line==2) && (position==2)){ g.setFont(new Font("MS ゴシック",Font.BOLD,12)); //g.drawString(messages2[line].substring(0,position), 200,500 + 40 * line); g.drawString("ねん", 200, 560); } if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ position += 1; }else{ position = 0; line += 1; } } bstrategy.show(); g.dispose(); } }

    • ベストアンサー
    • Java
  • javaの質問です。24フォントでg.drawString表示した文字

    javaの質問です。24フォントでg.drawString表示した文字に、8フォントのg.drawStringをy軸をいじり、ふりがなをつけたいのです。24フォントの文字の上に8フォントを表示するのだからx軸を3倍し、24フォントの半分の12を足せばいい(ふりがなが一文字の場合)とおもっていたのですが。24フォントの「あ*10」と8フォントの「あ*30」を表示し試したところ少しずつずれているようです。(以下のプログラムで試してみました)。x軸を揃え表示するためにはどうすればいいでしょうか import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class MojiTest2 { JFrame frame1; BufferStrategy bstrategy; MojiTest2(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),2,15); } public static void main(String args[]){ MojiTest2 gtm =new MojiTest2(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "あelloWorlハローワールド", "あいうあいうあいうあいうあいうあいうあいうあいうあい", "年収うううう万円の米市職員退職"}; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); g.drawString(messages[line].substring(0,position), 76,500 + 40 * line); g.drawString("ああああああああああああああああああああ", 76, 480); if((line==2) && (position==2)){ g.setFont(new Font("MS ゴシック",Font.BOLD,8)); g.drawString("ああああああああああああああああああああああああああああああ" + "ああああああああああああああああああああああああああああああ", 76, 460); }if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); } } }

    • ベストアンサー
    • Java
  • 文字制限節約のためimportは省きます

    文字制限節約のためimportは省きます public class MojiTest0621p2 { JFrame frame1; BufferStrategy bstrategy; int count =0; MojiTest0621p2(){     frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right,400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null);          frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); Timer t=new Timer(); t.schedule(new MyTimerTask(),10,500); } public static void main(String args[]){ MojiTest0621p2 gtm =new MojiTest0621p2(); } class MyTimerTask extends TimerTask{ @Override public void run() { Graphics g=bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets=frame1.getInsets(); g.translate(insets.left,insets.top);//左上 文字は別 g.setColor(Color.BLUE); String sa = "Hello、Worldハローワールド"; // 文字列saを生成 String sb = "えんがち"; // 文字列sbを生成 String sc = "あつい"; // 文字列scを生成 int gyo1=0; int gyo2=0; int gyo3=0; String str1="Hello、Worldハローワールド"; String str2="えんがち"; g.setFont(new Font("SansSerif",Font.BOLD,20)); for(gyo1=1;gyo1<=sa.length();gyo1++){ String s1 = sa.substring(0 , gyo1); // 1文字目からi文字目を取得 g.drawString(s1, 100, 100); } if(str1.equals(sa)==true){ for(gyo2=1;gyo2<=sb.length();gyo2++){ String s2 = sb.substring(0 , gyo2); // 1文字目からi文字目を取得 g.drawString(s2, 100, 150); } } (str2.equals(sb)==true){ for(gyo3=1;gyo3<=sc.length();gyo3++){ String s3 = sc.substring(0 , gyo3); g.drawString(s3, 100, 200); } } bstrategy.show();} g.dispose(); } } } javaの質問です ノベルゲームのTimerTaskでオートモードを作りたいのですがうまく作れません。 Hello、Worldハローワールドを一文字ずつ毎秒ごとに描画し、読み終わったら えんがちを一文字ずつ描画するというプログラムを組みたいです。 上記のプログラムをベースに(でもいくらでも変えていいですよ)改善箇所、修復箇所を お願いします

    • ベストアンサー
    • Java
  • javaでのコンテントペインの使い方についてです

    public class GameTestMain { JFrame frame1; BufferStrategy bstrategy; int count = 0; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setResizable(false); frame1.setLocationRelativeTo(null); Container pane = frame1.getContentPane(); pane.setBackground(Color.WHITE); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); Timer t = new Timer(); t.schedule(new MyTimerTask(), 0, 500); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } class MyTimerTask extends TimerTask{ public void run () { Graphics g = bstrategy.getDrawGraphics(); if (bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.translate(insets.left, insets.top); g.setColor(Color.BLUE); g.fillRect(0, 0, 100, 100); bstrategy.show(); g.dispose(); } } } } (文字数の関係でimport文は省略) 四角形を表示させる部分を追記したところ、背景が白でなくなってしまいました。 以前、Jframeに直接描写するのではなく、コンテントペインという透明レイヤーのインスタンスを取得し、そこに色々と表示させていくということを耳にしました。 背景を白にしたのが反映されないのは、四角形をコンテントペインのインスタンスでなくframe1に直接表示させているからではないかと思うのですが、背景の時に作製した「pane」とは別に新しくコンテントペインのインスタンスを取得し、そこに描写するのがいいでしょうか? どちらにしてもコンテントペインのインスタンスに四角形を描写する方法がわかりません。 背景の部分についてはネットで同じような質問をされている方がいたので、 その回答を元に記入しました。 今読んでいる入門本、「JAVAわくわくゲームプログラミング教室」だとコンテントペインなしで解説されているのですが、せっかくなのでコンテントペインも同時に導入しながら進めたいです。 これからこの本で簡単なゲームを作成するところまでやっていきますので、 コンテントペインの大まかな仕組みや使い方を理解していなければ同じように躓くと思います。 なので、今この場を切り抜ける方法も教えて欲しいのですが、コンテントペインの使い方がわかる書籍なども知っている方がいれば教えていただけないでしょうか。 よろしくお願いします。

  • Javaでパラパラアニメを作成するには、

    どうしたらいいのでしょうか。 初心者なのにイキナリ作ることになってしまいました。 5枚の絵をループでアニメーションさせたいのですが。 フレームを作るところまでは出来たのですが、その先がよく分かりません。どのようにして画像を読み込んで一定のタイミングではなくそれぞれの絵のタイミングでアニメさせればいいのでしょうか、お願い致します。 import java.awt.Insets; import javax.swing.JFrame; public class Animetion { static JFrame frame1; Animetion(){ frame1 = new JFrame("アニメ"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); } public static void main(String[] args) { Animetion gtm = new Animetion(); //インスタンス Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right,400 + insets.top + insets.bottom); } }

    • ベストアンサー
    • Java
  • 次のように書いたのですが、ウィンドウの背景色が白になりませんでした。setBackground辺りがおかしいと思うんですが。

    本に書いてあった下記のプログラムを書いて実行したのですが、ウィンドウズの背景色が白になりませんでした。 setBackground(WHITE)をBLACKにしても、背景色は変わりません。 どこに問題があるのか教えていただけないでしょうか。 import javax.swing.JFrame; import java.awt.Color; import java.awt.Insets; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } Eclipse3.0.1を使っています。 よろしくお願いしますm(_ _)m

  • javaのタイマープログラムの時間について

    下記のjavaのプログラムは、タイマー動作の確認プログラムです。 タイマーの起動時間を1msにし、1000回タイマーを起動しており トータルのタイマー時間は1秒と考えましたが、実際のタイマー時間は 20秒くらいかかります。 この件に関しまして、コメント頂けますと大変助かります。 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; public class TimerTest1 extends JFrame implements ActionListener{ Timer timer; JLabel label; int sec; public static void main(String[] args){ TimerTest1 frame = new TimerTest1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } TimerTest1(){ sec = 0; label = new JLabel(); JPanel labelPanel = new JPanel(); labelPanel.add(label); timer = new Timer(1, this); getContentPane().add(labelPanel, BorderLayout.CENTER); timer.start(); } public void actionPerformed(ActionEvent e){ label.setText(sec + " sec"); if (sec >= 1000){ timer.stop(); label.setText(" timer_stop"); }else{ sec++; } } } 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • eclipseにて~背景色が表示されない~

    JAVAゲームプログラムミング教室という本でただいまゲームを作っているのですが 本にそって、それどおりに進めていたのですが、ウィンドウの背景色を決めるところでエラーも出ていないのに指定された背景色になりません 以下にプログラムを書きます package jp.aroro.minigame; import java.awt.Color; import java.awt.Insets; import javax.swing.JFrame; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets();// frame1.setSize(600+insets.left+insets.right,400+insets.top+insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } } flame1のセットに関してはカラー以外問題なく実行されており、コンパイラ時にもエラーが出ません。 しかし、背景色は表示されません。 本の実際の実行画面では無色?→白色となっておるのですが、無色(グレーみたいな)のままです。 ちなみにEclipseのバージョンは3.0.1で 関係あるか分かりませんが Java Runtime Environment Version 6 Update 2 というものもダウンロードしてあります。 原因が分かる方はご教授ください。

    • ベストアンサー
    • Java
  • ボールが勝手に動き困ってます。

    前回にひき続き困ってます>< タイトル画面→(Enterクリック)→ゲーム画面までできたんですが ゲーム画面でボールとタイマーを動かしたくてやってみるとタイマーはうまく いったのにボールが動く速度を変更できず、勝手に動いてしまいます><どう 改善すればいいでしょうか。ソースコードみにくいですが助言お願いします。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class JavaGame3 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("ゲームフレーム"); frame.setSize(500, 550); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Testpanel panel = new Testpanel(); frame.add(panel); frame.setVisible(true); } } class Testpanel extends JPanel implements Runnable{ private Ball[] balls; static final int TITLE = 0; static final int GAME = 1; private int mode; private int sec; private Timer timer; private Thread t; public Testpanel() { balls = new Ball[5]; java.util.Random rr = new java.util.Random(); for(int i=0; i<balls.length; i++) balls[i] = new Ball(10*i+6,10*i+31,rr.nextInt(5)+1, rr.nextInt(5)+1); sec = 0; setBackground(Color.black); addKeyListener(new JavaKeyListener()); setFocusable(true); timer = new Timer(1000, new JavaActionListener()); mode = TITLE; t = new Thread(this); } class JavaActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (sec == 30) { timer.stop(); } else { sec++; } } } private void drawTitle(Graphics g) { g.setColor(Color.blue); g.drawString("タイトル", 165, 150); g.setColor(Color.white); g.drawString("Hit Enter Key!", 150, 350); } public void drawGameOver(Graphics g) { g.setColor(Color.white); g.setColor(Color.red); g.drawString(sec + "sec", 230, 300); repaint(); for (int i=0; i<balls.length; i++) balls[i].draw(g); } protected void paintComponent(Graphics g) { super.paintComponent(g); if(mode == TITLE) { drawTitle(g); } else if(mode == GAME) { drawGameOver(g); } } class JavaKeyListener implements KeyListener { public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if(mode == TITLE) { switch(key) { case KeyEvent.VK_ENTER: mode = GAME; timer.start(); t.start(); sec = 0; break;} } else { switch (key) { case KeyEvent.VK_ENTER: mode = TITLE; break; } }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } public void run() { while(true) { try { Thread.sleep(100); } catch (Exception e) {} repaint(); } } } class Ball { private int x, y, vx, vy, r; public Ball(int x, int y, int vx, int vy) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; r = 30; } public void draw(Graphics g) { g.fillOval(x, y, r, r); x += vx; y += vy; if(x < 0 || x > 457) vx = -vx; if(y < 0 || y > 433) vy = -vy; } }

    • ベストアンサー
    • Java

専門家に質問してみよう