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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

3回答

2501閲覧

labelの名前を変数にすることは可能ですか。

TOMATO1235

総合スコア2

Java

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/08/13 05:20

前提・実現したいこと

神経衰弱のプログラムを作っていて、トランプ一枚一枚をインスタンスとして作りました。
トランプインスタンス一つ一つがラベルを持つように作り、個別で削除したりできるようにするため、number変数を作り、それを元にラベルを作るようにしたのですが↓のようなエラーが出てしまいました。
ラベル名は変数だとダメなのでしょうか?

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

D:\JavaGame0\neurasthenia>javac *.java Trump.java:56: エラー: 文ではありません JLabel this.name = new JLabel(icon); ^ Trump.java:56: エラー: ';'がありません JLabel this.name = new JLabel(icon);

該当のソースコード

Turmp.java

java

1import java.util.*; 2import javax.swing.*; 3 4public class Trump { 5 6 static int counter; 7 8 static int position = 1; 9 10 int direction; 11 12 public int number; 13 14 String name = 0; 15 16 17 public int counterMemo; 18 19 public int positionMemo; 20 21 String picture; 22 23 public void startAdd() { 24 25 counter++; 26 27 if (counter <= 2) { 28 position++; 29 counter--; 30 } 31 32 counterMemo = counter; 33 positionMemo = position; 34 add(); 35 } 36 37 public void add() { 38 39 if (direction == 0) { 40 picture = "card_back.png"; 41 direction = 1; 42 }else{ 43 switch (this.number) { 44 case 1: 45 picture = "card_spade_01.png"; 46 break; 47 case 2: 48 picture = "card_spade_02.png"; 49 break; 50 } 51 direction = 0; 52 } 53 54 ImageIcon icon = new ImageIcon(picture); 55 56 JLabel this.name = new JLabel(icon); 57 58 NEFrame.panel.add(this.name); 59 60 name.setBounds(counterMemo * 200, position * 100, 200, 293); 61 62 } 63 64 public void reverse() { 65 66 this.disappear(); 67 68 this.add(); 69 } 70 71 public void disappear() { 72 73 NEFrame.panel.remove(this.name); 74 75 } 76 77 Trump(int number, String name) { 78 79 this.number = number; 80 81 this.name = name; 82 83 } 84 85}//endturmp 86

NEFrame.java

java

1import java.awt.*; 2import javax.swing.*; 3import java.util.*; 4 5/** 6 * HelloJavaGame 7 */ 8public class NEFrame extends JFrame{ 9 10 public static NEPanel panel = null; 11 12 public static Trump[] trumps = new Trump [4]; 13 14 /** 15 * ここからはじまります。*/ 16 17 18 public static void main(String[] args){ 19 NEFrame hg = new NEFrame(); 20 21 int q; 22 int w = 0; 23 for (q = 0; q <= trumps.length / 2; q++) { 24 trumps[w] = new Trump (q, "a" + String.valueOf(w)); 25 w++; 26 trumps[w + 1] = new Trump (q, "a" + String.valueOf(w)); 27 w++; 28 } 29 30 31 addTrump(); 32 } 33 34 public static void addTrump() { 35 36 37 for (int e = trumps.length - 1; e > 0; e--) { 38 int r = (int) (Math.random() * (e + 1)); 39 Trump tmp = trumps[e]; 40 trumps[e] = trumps[r]; 41 trumps[r] = tmp; 42 } 43 int u; 44 for (u = 0; u <= trumps.length; u++) { 45 u--; 46 trumps[u].startAdd(); 47 u++; 48 } 49 50 } 51 52 public static void clear() { 53 54 55 56 panel.resetPoint(); 57 58 int i; 59 for (i = 0; i < trumps.length; i++) { 60 i--; 61 trumps[i].disappear(); 62 i++; 63 } 64 65 addTrump(); 66 } 67 68 69 70 71 /** 72 * コンストラクタ 73 */ 74 public NEFrame(){ 75 76 // フレームを生成 77 JFrame frame = new JFrame("neurasthenia"); 78 79 // ×ボタンが押されたら、終了する 80 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 81 // レイアウト設定 82 frame.setLayout(new BorderLayout()); 83 84 // パネルを生成 85 JPanel panel = new JPanel(); 86 87 // パネルサイズを設定 88 panel.setPreferredSize(new Dimension(1024, 640)); 89 // レイアウト設定 90 panel.setLayout(null); 91 92 // フレームにパネルを設定 93 frame.setContentPane(panel); 94 95 96 // フレームを表示 97 frame.setVisible(true); 98 // サイズを最適化する 99 frame.pack(); 100 101 } // end HelloJavaGame 102 103 104 105 106 107} 108

NEPanel.java

java

1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.*; 4 5/** 6 * パネルクラス 7 */ 8public class NEPanel extends JPanel { 9 10 private NEMouseAdapter mgma = null; 11 12 private int x = 0; 13 private int y = 0; 14 15 public static int point = 0; 16 17 int counter2 = 0; 18 19 int counter2Pre = 0; 20 21 /** 22 * コンストラクタ 23 */ 24 public NEPanel() { 25 26 // スーパークラスを呼び出す 27 super(); 28 29 // パネルサイズ 30 super.setPreferredSize(new Dimension(800, 600)); 31 // レイアウト設定 32 super.setLayout(null); 33 34 // マウスアダプタを生成 35 mgma = new NEMouseAdapter(); 36 // パネルにマウスリスナーを追加する 37 super.addMouseListener(mgma); 38 39 } // end MGPanel 40 41 public static void resetPoint() { 42 43 point = 0; 44 45 } 46 47 48 /** 49 * マウスアダプタ 50 */ 51 private class NEMouseAdapter extends MouseAdapter { 52 53 /** 54 * マウスがクリックされた時に呼ばれます 55 */ 56 57 58 public void mouseClicked(MouseEvent me){ 59 60 61 62 // 場所を記憶する 63 x = me.getX(); 64 y = me.getY(); 65 66 for (counter2 = 0; counter2 <= NEFrame.trumps.length; counter2++) { 67 68 if (x >= NEFrame.trumps[counter2].counterMemo * 200 - 200 && x <= NEFrame.trumps[counter2].counterMemo * 200 && y >= NEFrame.trumps[counter2].positionMemo * 100 - 293 && y <= NEFrame.trumps[counter2].position * 100) { 69 70 NEFrame.trumps[counter2].reverse(); 71 72 if (counter2Pre == 0) { 73 74 counter2Pre = counter2; 75 76 }else{ 77 78 if (NEFrame.trumps[counter2Pre].number == NEFrame.trumps[counter2].number) { 79 80 NEFrame.trumps[counter2].disappear(); 81 NEFrame.trumps[counter2Pre].disappear(); 82 83 point++; 84 85 if (point == NEFrame.trumps.length / 2) { 86 87 NEFrame.clear(); 88 89 } 90 }else{ 91 92 NEFrame.trumps[counter2].reverse(); 93 NEFrame.trumps[counter2Pre].reverse(); 94 95 96 } 97 counter2Pre = 0; 98 } 99 } 100 } 101 102 103 } // end mouseClicked 104 105 } // end NEMouseAdapter 106 107} 108

試したこと

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

ファイル構成としては、以下のJavaファイルと画像を一つのフォルダ内に設置してコンパイル実行しています。

NEPanel.java
NEFrame.java
Trump.java
card_back.png
card_spade_01.png
card_spade_02.png

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

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

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

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

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

guest

回答3

0

JLabel this.name = new JLabel(icon);

変数名の冒頭に型があるので「宣言」になります。(宣言と同時にnewで初期化)

this.nameはTurmpクラスのnameを指すはずです。
Stringで定義されています。

java

1String name = 0; 2

それにStringに対して数値型となる0は入らないのでは?
他にもいろいろと間違えてそうに思います。

ひとまずそのTurmp.nameをどう扱いたいのか分からないのですが、
JLabel型の変数を1つ用意してそちらに差し替えれば一つ進みそうに思います。

ただ、もしテキストエディタをプログラミング用ではないもの、もしくはIDEでないものなら開発環境を整備するところから始めた方が良さそうです。

上記指摘したようなことはコンパイル前に教えてくれます。

以下はeclipseの例。
イメージ説明

イメージ説明
※私の環境にNEFrameクラスは取り込んでないのでエラー出てます。

投稿2021/08/13 05:55

m.ts10806

総合スコア80875

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

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

TOMATO1235

2021/08/13 07:43

ご指摘ありがとうございます。検討してみます。
m.ts10806

2021/08/13 11:19

やりたいことだけやってても出来るようにはなりませんよ。
TOMATO1235

2021/08/13 12:42

すみません、エディターの話でした。
guest

0

いろいろ起きそうなコードですので、弄ってみたものを載せさせて頂きます。

Trump.java

java

1import javax.swing.Icon; 2import javax.swing.ImageIcon; 3 4public class Trump { 5 static ImageIcon closeImage = new ImageIcon("card_back.png"); //裏イメージ 6 7 enum State { 8 OPEN, //表 9 CLOSE; //裏 10 11 State reverse() { 12 return this == OPEN ? CLOSE : OPEN; 13 } 14 } 15 16 private int number; 17 //private String name; 18 private State state = State.CLOSE; 19 private ImageIcon openImage; //表イメージ 20 21 Trump(int number) { 22 this.number = number; 23 openImage = new ImageIcon(String.format("card_spade_%02d.png",number)); 24 } 25 26 State getState() { 27 return state; 28 } 29 int getNumber() { 30 return number; 31 } 32 Icon getIcon() { 33 if(state == State.OPEN) return openImage; 34 return closeImage; 35 } 36 37 void close() { 38 state = State.CLOSE; 39 } 40 41 //ひっくり返す 42 void reverse() { 43 state = state.reverse(); 44 } 45}

NEFrame.java

java

1import javax.swing.JFrame; 2 3public class NEFrame extends JFrame { 4 /** 5 * ここからはじまります。*/ 6 public static void main(String[] args) { 7 // フレームを表示 8 new NEFrame().setVisible(true); 9 } 10 11 /** 12 * コンストラクタ 13 */ 14 public NEFrame() { 15 16 // フレームを生成 17 super("neurasthenia"); 18 19 // ×ボタンが押されたら、終了する 20 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 22 // パネルを生成・フレームにパネルを設定 23 setContentPane(new NEPanel()); 24 25 // サイズを最適化する 26 pack(); 27 } 28}

NEPanel.java

java

1import java.awt.GridLayout; 2import java.awt.event.MouseAdapter; 3import java.awt.event.MouseEvent; 4import java.awt.event.MouseListener; 5import java.util.ArrayList; 6import java.util.Collections; 7import java.util.List; 8 9import javax.swing.JLabel; 10import javax.swing.JPanel; 11import javax.swing.SwingWorker; 12 13/** 14 * パネルクラス 15 */ 16public class NEPanel extends JPanel { 17 static final int CARDS_MAX = 4; 18 static final String TRUMP_PROPERTY = "trump"; 19 20 private List<Trump> cardList = new ArrayList<Trump>(CARDS_MAX); 21 private JLabel labels[] = new JLabel[CARDS_MAX]; 22 23 private MouseListener mouselistener = new NEMouseAdapter(); 24 25 /** 26 * コンストラクタ 27 */ 28 public NEPanel() { 29 30 // スーパークラスを呼び出す 31 super(new GridLayout(1, 4)); // レイアウト設定 32 33 //カード表示ラベル 34 for(int i=0; i<labels.length; i++) { 35 labels[i] = new JLabel(); 36 add(labels[i]); 37 } 38 setMouseListener(); 39 40 //カード準備 41 for(int i=0; i<CARDS_MAX; i++) { 42 cardList.add(new Trump(i/2+1)); 43 } 44 45 setCards(); 46 } 47 48 void setCards() { 49 //シャッフル 50 Collections.shuffle(cardList); 51 52 //ラベルにセット 53 for (int i=0; i<CARDS_MAX; i++) { 54 cardList.get(i).close(); //裏 55 labels[i].putClientProperty(TRUMP_PROPERTY, cardList.get(i)); 56 labels[i].setIcon(cardList.get(i).getIcon()); 57 labels[i].setVisible(true); 58 } 59 } 60 61 private boolean allOpen() { 62 boolean allOpen = true; 63 for(int i=0; i<cardList.size() && allOpen; i++) { 64 if(cardList.get(i).getState() == Trump.State.CLOSE) allOpen = false; 65 } 66 return allOpen; 67 } 68 private void setMouseListener() { 69 for (int i = 0; i < labels.length; i++) { 70 labels[i].addMouseListener(mouselistener); 71 } 72 } 73 private void removeMouseListener() { 74 for (int i = 0; i < labels.length; i++) { 75 labels[i].removeMouseListener(mouselistener); 76 } 77 } 78 79 /** 80 * マウスアダプタ 81 */ 82 private class NEMouseAdapter extends MouseAdapter { 83 private JLabel labelOne; //表にした1枚目 84 /** 85 * マウスクリックされた時に呼ばれます 86 */ 87 public void mouseClicked(MouseEvent me) { 88 JLabel labelTwo = (JLabel)me.getComponent(); 89 Trump cardTwo = (Trump)labelTwo.getClientProperty(TRUMP_PROPERTY); 90 91 cardTwo.reverse(); 92 labelTwo.setIcon(cardTwo.getIcon()); 93 repaint(); 94 95 if (labelOne == labelTwo) { //1枚目を裏に戻しただけ? 96 labelOne = null; 97 return; 98 } 99 if(labelOne == null) { //1枚目? 100 labelOne = labelTwo; 101 return; 102 } 103 104 removeMouseListener(); 105 Trump cardOne = (Trump)labelOne.getClientProperty(TRUMP_PROPERTY); 106 if (cardTwo.getNumber() == cardOne.getNumber()) { //2枚目と1枚目が同じカード 107 if (allOpen()) { //ゲームクリア? 108 new RestartWorker().execute(); 109 } else { 110 new InvisibleWorker(labelOne, labelTwo).execute(); 111 } 112 } else { //同じでは無かった 113 new RedoWorker(labelOne, cardOne, labelTwo, cardTwo).execute(); 114 } 115 labelOne = null; 116 } 117 } 118 119 abstract class DelayWorker extends SwingWorker<Object,Object> { 120 private long delay; 121 DelayWorker(long delay) { 122 this.delay = delay; 123 } 124 @Override 125 public Object doInBackground() { 126 try { 127 Thread.sleep(delay); 128 } catch (InterruptedException e) { 129 e.printStackTrace(); 130 } 131 return null; 132 } 133 } 134 135 //1秒後に One,Two それぞれを非表示状態にし再表示する 136 class InvisibleWorker extends DelayWorker { 137 private JLabel labelOne, labelTwo; 138 InvisibleWorker(JLabel labelOne, JLabel labelTwo) { 139 super(1000); 140 this.labelOne = labelOne; 141 this.labelTwo = labelTwo; 142 } 143 @Override 144 protected void done() { 145 labelOne.setVisible(false); 146 labelTwo.setVisible(false); 147 repaint(); 148 setMouseListener(); 149 } 150 } 151 //1秒後にリスタート状態にする 152 class RestartWorker extends DelayWorker { 153 RestartWorker() { 154 super(1000); 155 } 156 @Override 157 protected void done() { 158 setCards(); 159 repaint(); 160 setMouseListener(); 161 } 162 } 163 164 //1秒後に One,Two それぞれを close 状態にし再表示する 165 class RedoWorker extends DelayWorker { 166 private JLabel labelOne, labelTwo; 167 private Trump cardOne, cardTwo; 168 RedoWorker(JLabel labelOne, Trump cardOne, JLabel labelTwo, Trump cardTwo) { 169 super(1000); 170 this.labelOne = labelOne; 171 this.cardOne = cardOne; 172 this.labelTwo = labelTwo; 173 this.cardTwo = cardTwo; 174 } 175 @Override 176 protected void done() { 177 cardOne.close(); 178 labelOne.setIcon(cardOne.getIcon()); 179 cardTwo.close(); 180 labelTwo.setIcon(cardTwo.getIcon()); 181 repaint(); 182 setMouseListener(); 183 } 184 } 185}

投稿2021/08/13 11:01

編集2021/08/13 11:20
jimbe

総合スコア13209

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

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

TOMATO1235

2021/08/13 12:44

助かります、勉強不足で読むのに時間がかかりそうですが参考にさせて頂きます。
jimbe

2021/08/14 05:23

このコードでは JLabel と Trump を関連付けるために putClientProperty/getClientProperty を使っていますが、JLabel を継承した(例えば TrumpLabel)クラスを作って Trump を入れてのラッパークラスにしても良いですね。 そうすれば「表裏を変更→ setIcon()」するメソッドも入れられますし。
guest

0

ベストアンサー

labelの名前を変数にすることは可能ですか。

不可能です
そういう場合は、ラベルを配列に入れて、インデックスを変数にしてアクセスすればいいです

投稿2021/08/13 06:18

y_waiwai

総合スコア88042

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

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

TOMATO1235

2021/08/13 07:42

出来ました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問