制御不能のキーアクションを再度制御する方法について

このQ&Aのポイント
  • awt.eventのKeyListenerを使ってキーアクションを設定した際、特定のキーが押されるとキーアクションが無効になり、再び同じキーが押されるとキーアクションが有効になるようにする方法はありますか?
  • キーアクションを制御するためにif文を使用しましたが、うまく機能しませんでした。例えば、flag=falseという条件を設定している状態で特定のキーが押されるとキーアクションが実行されるようにする方法はありますか?
  • 質問者が試した方法では、キーアクションを再度制御することができませんでした。キーが押された時に特定の条件下でキーアクションを有効にする方法について教えてください。
回答を見る
  • ベストアンサー

JAVAのキーアクションについて

awt.eventのKeyListenerを使ってキーアクションを設定したのですが、例えば"ENTER"を押すとキーアクションが無効になり再び"ENTER"を押すとキーアクションを有効になるといったように、キーアクションを制御することはできないのでしょうか?ちなみ以下のようににif文を使ってもできませんでした。 flag=falseを設定してある public void keyPressed(KeyEvent keyEvent){   if(keyEvent.getKeyCode()==KeyEvent.VK_LEFT){     A();   } } public void A(){   if(flag=false){      ・     ・     ・    } }

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

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

if (keyEvent.getKeyCode() == KeyEvent.VK_ENTER) { if (flag == false) { ですよ。=と==は大違いです。ただし、これに限って言えば後者は if (!flag) { と書いたほうがすっきりします。 もちろん、A()メソッドが実行されるたびにflagの値がチェンジするようになっているんですよね……?

shuncillin
質問者

お礼

ありがとうございました。そうですよね、=と==は違いますよね。すいませんこんなこと質問して。

関連するQ&A

  • Java バックグラウンドでキーを監視したい

    Swingを使用しています。ウィンドウにフォーカスが外れても、どのキーが押されたか判定できる方法を教えて下さい。 フォーカスがあっていれば、動作するプログラムは作れました。 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class KeyListenerOnBackgroundTest extends JFrame implements KeyListener{ public KeyListenerOnBackgroundTest() { setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); addKeyListener(this); } public static void main(String[] args){ new KeyListenerOnBackgroundTest().setVisible(true); } @Override public void keyPressed(KeyEvent e) { // 文字とコードを表示する System.out.println(e.getKeyCode()+":"+e.getKeyChar()); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) { } }

    • ベストアンサー
    • Java
  • java ダブルバッファリングするがちらつく

    javaでゲームをつくろうかと考えています。 そこで、ダブルバッファリングを実装したのですが、ちらついてしまいます。 いろいろ検索をかけて調べたのですが、これ以上改善が見込めないので 質問します。 以下がソースコードです。 画面がちらつくので、画面のリフレッシュレートが関係しているのかわからず、 しかし、ふつうにjava applet でゲームがあるので、多分どこかが間違っていると思います。 ご指摘をお願いします。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.net.URL; /*<applet code="applet01" width="320" height="480"></applet>*/ public class applet01 extends Applet implements KeyListener, Runnable { String text = ""; Image image; int x = 100, y = 100; KeyInput key; Image image弾; Bullet bullet; int flag_x = 1; Image backbuffer; Graphics ct; Dimension dim; // 初期化 public void init() { // image = getImage( getDocumentBase(), "test.jpg" ); image = getImage( getCodeBase(), "test.jpg" ); image弾 = getImage( getCodeBase(), "弾.jpg" ); bullet = new Bullet(); key = new KeyInput(); dim = getSize(); backbuffer = createImage( dim.width, dim.height ); ct = backbuffer.getGraphics(); Thread th = new Thread( this ); th.start(); addKeyListener( this ); requestFocus(); } // public void run() { try { while(true) { repaint(); Thread.sleep(1000/60); if( x>640 ) flag_x = 1; if( x<0 ) flag_x = 0; if( 1 == flag_x ) x--; if( 0 == flag_x ) x++; } } catch( Exception err ) { } } // 描画 public void paint( Graphics g ) { ct.setColor( Color.white ); ct.fillRect( 0, 0, dim.width, dim.height ); ct.setColor( Color.red ); ct.fillRect( (dim.width/2)-50 , (dim.height/2)-50, x, y ); // 裏画面に描画 ct.drawString( "画面をクリックしてキーボードで操作できます。", 0, 20 ); ct.drawString( "Hello from Java!", 60, 100 ); ct.drawImage( image, x, y, this ); bullet.Draw( ct, this, image弾 ); // 裏画面を表に反映 g.drawImage( backbuffer, 0, 0, this ); } // キーの入力があったとき public void keyTyped( KeyEvent e ) { repaint(); } // キーが押されたとき public void keyPressed( KeyEvent e ) { key.keyPressed( e ); if( key.isPressing( KeyEvent.VK_UP ) ) y = y - 5; if( key.isPressing( KeyEvent.VK_DOWN ) ) y = y + 5; if( key.isPressing( KeyEvent.VK_LEFT ) ) x = x - 5; if( key.isPressing( KeyEvent.VK_RIGHT ) ) x = x + 5; if( KeyEvent.VK_UP == e.getKeyCode() ) y = y - 5; if( KeyEvent.VK_Z == e.getKeyCode() ) { bullet.x = x; bullet.y = y; } repaint(); } // キーが放されたとき public void keyReleased( KeyEvent e ) { key.keyReleased( e ); } }

    • ベストアンサー
    • Java
  • TABキーの検出

    Swingコンポーネントで、TABキーのイベントを取得する 方法を教えてください。 タブキー以外は検出できるのですが… import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class TabKeyListener { public TabKeyListener() { JPanel panel = new JPanel(); panel.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } ); JFrame frame = new JFrame(); frame.add(panel); frame.setBounds(100,100,200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); panel.requestFocusInWindow(); } public static void main(String[] args) { new TabKeyListener(); } }

    • ベストアンサー
    • Java
  • キーリピート?(Javaプログラミング)

    こんにちは。 Javaの基礎を一通り勉強したので、簡単なゲームでも作ってみようと思ったのですが、早速問題にぶつかってしまいました。 キーを入力して左右にキャラを移動させたいのですが、 キーを押し続けると最初の1歩はすぐに移動してくれるのですが、 そのあとワンテンポ遅れてから、「ズダダダダダ」ってな感じ?で動いてしまいます。 調べてみたら、キーリピートというのが問題になっていることは分かったのですが、 どうすれば普通のゲームのように動いてくれるのでしょうか? 今はまだ下のような感じなんですが・・・。(右に動くとき) public void keyPressed(KeyEvent e) {   if(e.getKeyCode() == e.VK_RIGHT){     muki = 1; // キャラの向き     px += 10; // キャラのx座標   } } よろしくお願いします。

    • ベストアンサー
    • Java
  • 多角形を動かす範囲を設定したいのですが…。

    多角形をKeyListenerで動かす範囲を設定 したいのですがどうすればいいでしょうか。 import java.awt.Color; import java.awt.Graphics; import java.awt.Polygon; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class JavaGame2 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("テスト"); frame.setSize(400, 400); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); frame.add(panel); frame.setVisible(true); } } class MyPanel extends JPanel implements KeyListener{ private Ziki ziki; public MyPanel() { setBackground(Color.black); ziki = new Ziki(); addKeyListener(this); setFocusable(true); } protected void paintComponent(Graphics g) { super.paintComponent(g); ziki.draw(g); } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_UP : ziki.moveUpZiki(); break; case KeyEvent.VK_RIGHT :ziki.moveRightZiki(); break; case KeyEvent.VK_DOWN : ziki.moveDownZiki(); break; case KeyEvent.VK_LEFT : ziki.moveLeftZiki(); break; }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } class Ziki { private Polygon p; public Ziki() { int[] xpoints = {240,260,250}; int[] ypoints = {260,260,240}; p = new Polygon(xpoints,ypoints,xpoints.length); } void draw(Graphics g) { g.fillPolygon(p); } public void moveLeftZiki() { for (int i=0; i < p.xpoints.length; i++ ) { p.xpoints[i] -= 5; } } public void moveRightZiki() { for (int i=0; i < p.xpoints.length; i++ ) { p.xpoints[i] +=5; } } public void moveUpZiki() { for (int i=0; i < p.ypoints.length; i++ ) { p.ypoints[i] -= 5; } } public void moveDownZiki() { for (int i=0; i < p.ypoints.length; i++ ) { p.ypoints[i] += 5; } } }

    • ベストアンサー
    • Java
  • 画面遷移について困ってます。

    TITLE →(Enterクリック)→ GAME というふうにしたいのですが…できません><どこがダメなんでしょうか。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; 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); frame.setVisible(true); Testpanel panel = new Testpanel(); frame.add(panel); } } class Testpanel extends JPanel implements KeyListener { static final int TITLE = 0; // タイトルモード static final int GAME = 1; // ゲームモード int mode; public Testpanel() { setBackground(Color.black); addKeyListener(this); mode = TITLE; // 最初はタイトル画面 } private void drawTitle(Graphics g) { g.setColor(Color.blue); g.drawString("test1", 165, 150); g.setColor(Color.white); g.drawString("Hit Enter Key!", 150, 350); } private void drawGameOver(Graphics g) { g.setColor(Color.white); g.fillRect(5,120,240,30); g.setColor(Color.red); g.drawString("test2", 85, 140); } public void paintComponent(Graphics g) { super.paintComponent(g); if(mode == TITLE) { drawTitle(g); } else if(mode == GAME) { drawGameOver(g); } } public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if(mode == TITLE) { switch(key) { case KeyEvent.VK_ENTER: mode = GAME; break; } }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} }

    • ベストアンサー
    • Java
  • JavaAppletのイベントの強制発生方法

    JavaAppletのイベント処理についてお伺いしたい事があります。 Appletで作成した画面にボタンAを設置し、 actionPerformedのイベントを作成しました。 private void ボタンA_actionPerformed (java.awt.event.ActionEvent ae) {   //処理内容 } ボタンAを押下すると上記のイベントが呼ばれ正常に動作するのですが、このイベント処理をボタンAを押下する以外の方法で呼び出す事は可能なのでしょうか? 下記内容は例として、ボタンBで[F1]が押されたらボタンAの押下処理を呼び出そうとしております。 private void ボタンB_keyPressed (java.awt.event.KeyEvent ke) {   java.awt.event.ActionEvent ae;   ae = ○○○○○○;   if (e.getKeyCode() == java.awt.event.KeyEvent.VK_F1) {     ボタンA_actionPerformed(ae);   } } java.awt.event.ActionEventで定義した変数aeの中身の所でつまづいております。 ご存知の方おりましたらご指導願います。

  • Javaのゲーム、ボタンの種類で攻撃画像を変える

    Javaでゲームを書いていてどうしてもできないところがあります。 スペースボタンを押したときと、Bボタンを押したときの攻撃のグラフィックを変えたいのですが、どちらのボタンを押してもスペースのときの画像になってしまいます。 ソースが長いため一部しか載せていませんが必要であれば分割して載せることも可能です。 どなたか教えていただけますでしょうか。 public void keyPressed ( KeyEvent e ){//(KeyEvent e ){ //キーが押された時に実行//void外したら if(e.getID()==KeyEvent.KEY_PRESSED){ switch (e.getKeyCode()){ case KeyEvent.VK_SPACE : smokeflag = true; iceflag = false; sh_x=0; sh_y=0; //return smokeflag; // magictype = 0; break; case KeyEvent.VK_B ://氷魔法 iceflag = true; smokeflag = false; sh_x=0; sh_y=0; // magictype = 1; //return iceflag; break; } } } public void dataload() { MediaTracker mt = new MediaTracker(this); TitleImage = getImage(getCodeBase(), "image/title.jpg"); mt.addImage(TitleImage, 0); for(int i=0;i<2;i++){ if( smokeflag == true ){ magictype = 0; } else if( iceflag == true ){ magictype = 1; } MagicImage[i] = getImage(getCodeBase(), "car/image/magic/" + magictype + "_" + i + ".gif");//car//magictype mt.addImage(MagicImage[i], 0); } try{ mt.waitForID(0); } catch(InterruptedException e) { showStatus(""+e); } }

  • アプレットでのキー入力

    具体的にいうと以下のアプレットを実行した場合に矢印キーを入力しても反応(上、下、、、が表示されない。)がないのです。 一度アプレット自体をクリックしても反応がありません。 何が悪いのでしょうか?よろしくお願いします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class practice extends JApplet { private JLabel lb1,lb2; public void init() { Container cnt = getContentPane(); lb1 = new JLabel("矢印キーでお選びください。"); lb2 = new JLabel(); cnt.add(lb1,BorderLayout.NORTH); cnt.add(lb2,BorderLayout.SOUTH); addKeyListener(new practiceKeyListener()); } class practiceKeyListener extends KeyAdapter { public void KeyPressed(KeyEvent e) { String str; int k = e.getKeyCode(); switch(k){ case KeyEvent.VK_UP: str = "上";break; case KeyEvent.VK_DOWN: str = "下";break; case KeyEvent.VK_LEFT: str = "左";break; case KeyEvent.VK_RIGHT: str = "右";break; default: str = "他のキー"; } lb2.setText(str + "ですね。"); } } }

    • ベストアンサー
    • Java
  • こんにちは

    こんにちは java初心者です。早速ですが質問させていただきます。 スペースキーを押したときに、ラベルにテキストを表示させる意図で 以下のようなコードを作りましたが、うまくいきません。 どなたか、ダメな点を指摘していただけないでしょうか。 よろしくお願いします。 import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; class KeyClass extends KeyAdapter { int keyshot; public KeyClass() { keyshot = 0; } public void keyPressed(KeyEvent e) { int kc = e.getKeyCode(); if( kc == KeyEvent.VK_SPACE) { if( keyshot == 0 ) { keyshot = 2 ;} else keyshot = 1; } } public void keyReleased(KeyEvent e) { int kc = e.getKeyCode(); if( kc == KeyEvent.VK_SPACE) { keyshot = 0; } } public int checkShotKey() { int ret = keyshot; if(keyshot == 2) keyshot =1; return ret; } } import java.applet.Applet; import java.awt.*; import java.awt.event.*; /*<applet code="keytest.class" width="300" height="100"></applet> */ public class keytest extends Applet implements Runnable { KeyClass keyclass; Thread th; Label label1; Label label2; String st1; int shotkey_state; int count; public void init() { setBackground( new Color(120,60,80) ); keyclass = new KeyClass(); addKeyListener(keyclass); label1 = new Label("スペース押してね"); label2 = new Label(); add(label1); add(label2); th = new Thread(this); th.start(); shotkey_state=0; } public void run() { while(true) { try{ Thread.sleep(1000); for(count=0; ; count++) { shotkey_state = keyclass.checkShotKey(); if( (shotkey_state==1 || shotkey_state==2)&&(count%4==0) ) { st1 = "スペース押したよ!!"; } else st1 = ""; label2.setText(st1); } } catch(InterruptedException ie) {} } } }

    • ベストアンサー
    • Java

専門家に質問してみよう