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

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

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

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

Q&A

解決済

3回答

289閲覧

変数を別クラスに移行したいんです。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/10/30 09:16

漸Javaのコンストラクタクラスを分配できたんですけど、次の問題がそしたら発生してしまって、
それが

キー入力データを代入した変数を本元のクラスに移動したいんですけど、やり方が全く分からなくて困っています。

どうかどなたか教えて下さい!!。
後宜しければ更にKeyListenerのキーインベント処理も上手く可動しないのでそちらも教えて頂ければ嬉しいです。

メインクラス

Java

1//import 2import java.awt.*; 3import javax.swing.*; 4import java.applet.Applet; 5import java.awt.event.KeyEvent; 6import java.awt.event.KeyListener; 7 8 9class Mine extends JFrame{ 10 11//メンバ変数 12static boolean Speace_key=false; 13 14static boolean UP_key=false; 15static boolean DOWN_key=false; 16static boolean LEFT_key=false; 17static boolean RIGHT_key=false; 18 19 //メイン関数。 20 public static void main(String args[]){ 21 22 MyFrame.EditFrame(); 23 MyFrame.key_inport(); 24 25 //変数宣言 26int x=0; int y=0; 27 28int HP=3; int score=0; 29int Lv=1; int xp=0; 30 31int tm_x=0; int tm_y=0; 32 33int tx=0; int ty=0; 34 35while(true){ 36if (Speace_key==false){System.out.println("キーが押されてないぜ?");} 37if (Speace_key==true){System.out.println("キーが押されたぜ!");} 38} 39 40 41 42 43 } 44 45 46 47}

コンストラクタクラス

Java

1//import 2import java.awt.*; 3import javax.swing.*; 4import java.applet.Applet; 5import java.awt.event.KeyEvent; 6import java.awt.event.KeyListener; 7 8 9public class MyFrame { 10 11 static boolean Speace_key = false; 12 13public static void EditFrame() { 14 15Mine Mine = new Mine(); 16 17JFrame jf = new JFrame("Shoting game"); 18 19jf.setResizable(false); 20jf.setVisible(true); 21 22//ウィンドウを表示 23jf.setSize(800, 700); 24jf.setLocationRelativeTo(null); 25jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 26//ここから先が表示プログラム 27jf.setLayout(new FlowLayout()); 28 29 30 31 //文字描画システム初期化 32 JLabel Text = new JLabel("Starting game if please space key"); 33 Text.setPreferredSize(new Dimension(350, 310)); 34 Text.setFont(new Font(null,0,25)); 35 36 //JFrameにオブジェクトを追加 37 jf.add(Text); 38} 39 public static void key_inport() { 40 KeyListener code = new KeyListener() { 41 42 43 @Override 44 public void keyTyped(KeyEvent e) { 45 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 46 } 47 48 @Override 49 public void keyPressed(KeyEvent e) { 50 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 51 52 if (KeyEvent==KeyEvent.VK_SPACE){ 53 Speace_key=true; 54 } 55 } 56 57 @Override 58 public void keyReleased(KeyEvent e) { 59 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 60 61 if (KeyEvent==KeyEvent.VK_SPACE){ 62 Speace_key=false; 63 } 64 65 66 } 67 }; 68 } 69 70}

どうかご回答宜しくお願いします。

ちなみにJavaSE JDKとも最新バージョンです。
使用クラスはswingです。(本当はAppletを使用したかったんですけどね、上手くエラーを修正して導入出来なかったんですよね・・。)

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

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

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

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

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

guest

回答3

0

ごちゃごちゃしているので、しっかりとは見ていないのですが、

とりあえず、次の2点は問題になっていそうです。

1.キーリスナーを作成しているが、どのにも関連付けされていない

 リスナーというのは、聞き手(聞く人/物)ですが、何に対して聞くかはその時点では決まっていません。
聞く対象に対して、「聞き手がいます」と宣言をしてあげる必要があります

 そうしないと聞く対象は、聞き手に対して何の情報も教えてはくれません。

  聞く対象.add聞く内容Listener(聞き手)

 という形で宣言をする必要があります。

 例えば、KeyListenerであるkeyListenerが、JFrame型のjfに対し、Keyイベントを要求するには、

   jf.addKeyKistener(keyListener);

 となります。

 

2.同じ名前の変数であっても、属しているクラスが違えば、両者は別のもの。staticであっても同様。

 
Mineクラスに定義したSpeace_key と MyFrameに定義したSpeace_key は別のものです。

 これを同じものとして処理していませんか?

 ※ところで、「Speace」とは? 「空白」のスペースなら、「space」です

投稿2018/10/30 14:54

ngsvx

総合スコア287

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

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

退会済みユーザー

退会済みユーザー

2018/10/31 09:54 編集

ご回答ありがとうございました!、とても丁寧に分かりやすくご回答くださってありがとうございます。 とても参考になりました、KeyListenerが例外になっていたんですね!、他の方からのコメントと照らし合わせて見た所漸く理解できました!!。 色々僕は曖昧に変な覚え方をしているようで、色々抜けていてなかなかコメントの中身が理解出来ませんでしたがどうにか、なりそうです!! 本当にありがとうございました。 ちなみにSpaceをSpeaceと間違えて記載していました、ご指摘ありがとうございます。
guest

0

パッとしか見てませんが、どのキーイベントも例外を最初に投げてるから動作しないのではないですか?


せっかくなので気になるところを指摘。
(指摘はしますが質問内容と外れるところが多いため、挙げたことを質問されてもここでは答えません。
復習するなり別途1つずつ質問を立てるなりしてください。)

質問文の内容から

  • コンストラクタクラスという用語がわかりません。
  • 今現在appletに拘る理由がない気がしますが、なぜappletでやりたかったのでしょう?

質問文の書き方から

  • 「書き方がわからない」のと「動作しない」のでは意味が異なります。

「動作しない」のであれば理想の出力と現状の出力、もしくはエラー文を提示しましょう。

  • 1質問1要件が理想です。ついでにーという質問が増えるのは回答しにくくなるのでおすすめしません。

全体的なコードから

  • インデントを付けましょう。
  • 不必要な空行はなくしましょう。
  • 英単語はなるべく正しく書きましょう。(speace→space)
  • 大文字小文字の規則は統一させましょう。

Mineクラスから

  • インポートしているものはJFrame以外ないので、import javax.swing.*以外不要です。
  • mainメソッドしかないならJFrameを継承している意味がないです。
  • whileループでキー判定をしていますが、MyFrameクラスのキーイベントで良いのでは?

MyFrameクラスから

  • Mineクラスをインスタンス化している理由が不明です。
  • クラス名からこちらがJFrameクラスを継承すべきな気がします。
  • key_inportメソッド(これも誤字)はどこから呼び出されるのですか?

投稿2018/10/30 09:23

編集2018/10/31 02:24
dice142

総合スコア5158

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

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

退会済みユーザー

退会済みユーザー

2018/10/30 09:30

確かに動作していない可能性がありますね・・・、ご指摘ありがとうございます。 ちなみにどのように改良すれば例外を解除できますか?、良ければ教えて頂けませんか?。 ちなみに僕は一応、シューティングゲームを制作するつもりでJavaのコードを書いています。
dice142

2018/10/30 09:32

ん? 「例外を最初に投げてるから動作しない」のであれば、単に例外を投げている処理を削除すれば良いのでは? 例外がわからなければ「Java 例外」で調べてみてください。
退会済みユーザー

退会済みユーザー

2018/10/31 10:53

・詳しい返信・ Q, コンストラクタクラスという用語がわかりません。 A, すいません僕がコンストラクタをするためのクラスという事から勝手ながら命名させて頂きました、 分かりにくくてすいません。 Q, 今現在appletに拘る理由がない気がしますが、なぜappletでやりたかったのでしょう? A, シューティングゲームを制作したいと思い、調べた所講座に多用されていたのでAppletの方を 使用した方が良いのかと思い使用しようと思い至りました。 Q, 「書き方がわからない」のと「動作しない」のでは意味が異なります。 「動作しない」のであれば理想の出力と現状の出力、もしくはエラー文を提示しましょう。 A, すいません頭が回っていなかった時に質問したので、変な質問文になっていましたね・・・、 書き方が分からないという物が一応正解です。 Q, 1質問1要件が理想です。ついでにーという質問が増えるのは回答しにくくなるのでおすすめしません。 A, 確かにそうですね、今後の質問投稿の際は1つずつ質問したいと思います。 Q, インデントを付けましょう。 A, 勝手ながら僕が個人的に軽くインデントを見やすくするために省いていたというのと単純に書き加える 事を前提として書いている途中の何もコードが整理されていない状態だったという事もあり、 かなりインデントが抜けていました、見にくくて申し訳ありません。 Q, 不必要な空行はなくしましょう。 A, 色々試しながら書いていたので変に空行やら空白やらが出来て見にくくなってしまっていました、 修正してから質問を投稿すれば良かったですね・・・。 修正して置きます。 Q、 英単語はなるべく正しく書きましょう。(speace→space) A, スペルミスが多くてすいません、プログラムを修正して置きます。 Q, 大文字小文字の規則は統一させましょう。 A, キャメルケース等の事ですね、完全に忘れていました、修正して置きます。 Q, インポートしているものはJFrame以外ないので、import javax.swing.*以外不要です。 A, 色々と試験的に試していた時に追加したImport文が残っていました、プログラム修正と一緒に これも削除して置きますね。 Q, mainメソッドしかないならJFrameを継承している意味がないです。 A, 確かにそうですね、それなら関数に直接継承した方が良いですね。 Q, whileループでキー判定をしていますが、MyFrameクラスのキーイベントで良いのでは? A, 一応コンストラクタとクラスで分けて無理やりコンストラクタを終了させて、ウィンドウを表示させた 後にループ処理をさせようとしたらいつの間にかこうなっていました。 Q, Mineクラスをインスタンス化している理由が不明です。 A, 変数を移行させようとしてインスタンス化しました。(そもそもの所そんな事はせずMyFrameクラスをMineクラスに合成すればどうにかなったかも知れませんね。) Q, クラス名からこちらがJFrameクラスを継承すべきな気がします。 A, そうですね、クラスに継承する必要がありませんでした。 Q, key_inportメソッド(これも誤字)はどこから呼び出されるのですか? A, 一応Mineクラスから呼び出すつもりでいました。
dice142

2018/10/31 11:01

わざわざ長い指摘に1つずつコメントしていただいたので最後にもう一つだけアドバイスを。 開発においてというか質問する時は特に用語ひとつで話が食い違います。 今回のコンストラクタクラスはおそらくオブジェクト指向におけるJavaの基本知識が まだちゃんと理解できていないからだと思います。 ところどころ用語と意味が合ってなさそうなところがあるので、 今作成されているものができたら今一度復習し直してみると良いでしょう。 (作成途中で復習すると完成前にやる気が削がれちゃうかもなので、できてからで良いかと。)
退会済みユーザー

退会済みユーザー

2018/11/03 08:39

アドバイスありがとうございます!、確かにそうですね★、もう一度あやふやな所を復習して見ます!!。 ちなみに今回のプログラムの場合はまだコンストラクタと例外を上手く理解できていなかったからだと思います、詳しい情報まできめ細かく復習しないと行けなさそうですねw。
guest

0

ベストアンサー

dice142さんやngsvxさんの言う通りですが、
・まず現在の最新バージョンではAppletは**ほぼ無理です。というか無理です。**JavaFXを使うべきです。
ネットでできるゲームにするなら Javascript 等の別言語を使用するのが妥当かと。

後、上の人の言っている「例外」とは

throw new UnsupportedOperationException("Not supported yet.");

です。この分を消して、実行したいことを書きましょう。

後、ぶっちゃけ言いますと、ソースを分ける必要がありません。
イメージでは、こんな感じでしょうか。(スパゲッティーだったり、エラーが出るかもしれませんが、
調べて、直してみてください。)

Java

1import java.awt.*; 2import javax.swing.*; 3import java.applet.*; 4import java.awt.event.*; 5 6class Mine extends JFrame{ 7 8static boolean Speace_key=false; 9 10//static boolean Speace_key = false; // 同じ変数(別クラスにあった) 11 12static boolean UP_key=false; 13static boolean DOWN_key=false; 14static boolean LEFT_key=false; 15static boolean RIGHT_key=false; 16 17int HP=3; int score=0; 18int Lv=1; int xp=0; 19 20int tm_x=0; int tm_y=0; 21 22int tx=0; int ty=0; 23int x=0; int y=0; 24 25public Mine( String title ) 26{ 27 super( title ); 28} 29 30 public static void main(String args[]){ 31 32 EditFrame(); 33 key_inport(); 34 35 while(true){ 36 if (Speace_key==false){System.out.println("キーが押されてないぜ?");} 37 if (Speace_key==true){System.out.println("キーが押されたぜ!");} 38 } 39 40public static void EditFrame() { 41 42Mine Mine = new Mine(); 43 44//JFrame jf = new JFrame("Shoting game"); // Mine が JFrame です 45 46setResizable(false); 47setVisible(true); 48 49setSize(800, 700); 50setLocationRelativeTo(null); 51setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 52//ここから先が表示プログラム 53setLayout(new FlowLayout()); 54 55 //文字描画システム初期化 56 JLabel Text = new JLabel("Starting game if please space key"); 57 Text.setPreferredSize(new Dimension(350, 310)); 58 Text.setFont(new Font(null,0,25)); 59 60 //JFrameにオブジェクトを追加 61 add(Text); 62} 63 64 public static void key_inport() { 65 KeyListener code = new KeyListener() { 66 @Override 67 public void keyTyped(KeyEvent e) { 68 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 69 } 70 71 @Override 72 public void keyPressed(KeyEvent e) { 73 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 74 75 if (KeyEvent==KeyEvent.VK_SPACE){ 76 Speace_key=true; 77 } 78 } 79 80 @Override 81 public void keyReleased(KeyEvent e) { 82 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 83 84 if (KeyEvent==KeyEvent.VK_SPACE){ 85 Speace_key=false; 86 } 87 } 88 }; 89 } 90}

あとJavaの関数名はキャメルケースというルールを使用します。簡単に言うと、はじめは大文字、単語が出たら初めの文字だけ大文字・・・というやつです。

あとインスタンス化、継承、実装を理解されていますか?一回もう一度確認してみることをお勧めします。

長文失礼いたしました。

投稿2018/10/30 11:15

編集2018/10/31 07:45
yukkuri

総合スコア624

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

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

fuzzball

2018/10/31 02:27

どうでもいいことですが、「上の人」だと並びが変わったときに通じなくなりますよ。
退会済みユーザー

退会済みユーザー

2018/10/31 03:40

すぐ↑の「ngsvx」さんは例外とか言ってないような
yukkuri

2018/10/31 07:45

すいません。修正しました
退会済みユーザー

退会済みユーザー

2018/10/31 09:52

更に分かりやすく解説して下さってありがとうございます!!、もう一度頭の中を整理した所、 クラスを一つに纏めて、クラスを同じソースコードに纏めて継承を無くして直接コンストラクタ後に、 ループ処理内でキー処理を行いたいと思います。 後それとキャメルケースの事を完全に忘れていました、これが無いと分かりにくいですよね・・・、 付け足して置きます!!。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問