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

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

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

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

Q&A

2回答

1378閲覧

java itemlisetenerの質問

TakuyaAsaka

総合スコア7

Java

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

0グッド

0クリップ

投稿2017/06/14 14:43

編集2017/06/14 15:15

itemlistenerの部分で質問です
表示がうまくいきません

java

1import java.awt.Color; 2import java.awt.GridLayout; 3import java.awt.event.ItemEvent; 4import java.awt.event.ItemListener; 5 6import javax.swing.ButtonGroup; 7import javax.swing.JFrame; 8import javax.swing.JLabel; 9import javax.swing.JPanel; 10import javax.swing.JRadioButton; 11 12@SuppressWarnings("serial") 13public class No1 extends JFrame implements ItemListener { 14 JRadioButton[] rb; 15 String[] str = { "3本", "4本", "5本", "6本" }; 16 JPanel p, p1, p2; 17 JLabel[][] s; 18 JLabel[] l, a; 19 20 No1() { 21 p = new JPanel(); 22 p1 = new JPanel(); 23 p2 = new JPanel(); 24 rb = new JRadioButton[4]; 25 l = new JLabel[5]; 26 a = new JLabel[5]; 27 s = new JLabel[5][5]; 28 ButtonGroup bg = new ButtonGroup(); 29 for (int i = 0; i < rb.length; i++) { 30 rb[i] = new JRadioButton(str[i]); 31 bg.add(rb[i]); 32 rb[i].addItemListener(this); 33 34 } 35 36 p.setLayout(new GridLayout(2, 1)); 37 p1.add(rb[0]); 38 p1.add(rb[1]); 39 p1.add(rb[2]); 40 p1.add(rb[3]); 41 42 p2.setLayout(new GridLayout(5, 1)); 43 for (int i = 0; i < l.length; i++) { 44 l[i] = new JLabel(); 45 p2.add(l[i]); 46 } 47 48 p.add(p1); 49 p.add(p2); 50 51 add(p); 52 53 a[0] = new JLabel("赤いワイヤー"); a[0].setForeground(Color.RED); 54 a[1] = new JLabel("青いワイヤー"); a[1].setForeground(Color.BLUE); 55 a[2] = new JLabel("黄色いワイヤー"); a[2].setForeground(Color.YELLOW); 56 a[3] = new JLabel("黒いワイヤー"); a[3].setForeground(Color.BLACK);; 57 58 59 60 s[0][0] = new JLabel( "ア)"+a[0]+"ない場合、ワイヤー2を切断します。"); 61 s[0][1] = new JLabel("イ)一番下のワイヤーが白い場合、そのワイヤーを切断します。"); 62 s[0][2] = new JLabel("ウ)青いワイヤーが複数ある場合、青いワイヤーの中で一番下のものを切断します。"); 63 s[0][3] = new JLabel("エ)ワイヤー3を切断します。"); 64 65 s[1][0] = new JLabel( "ア)赤いワイヤーが複数あり、かつシリアルナンバーの最後の桁が奇数なら、赤いワイヤーの中で一番下のものを切断します。"); 66 s[1][1] = new JLabel("イ)一番下のワイヤーが黄色く、かつ赤いワイヤーがない場合、ワイヤー1を切断します。"); 67 s[1][2] = new JLabel("ウ)青いワイヤーが一本だけの場合、ワイヤー1を切断します。"); 68 s[1][3] = new JLabel("エ)黄色いワイヤーが複数ある場合、ワイヤー4を切断します。"); 69 s[1][4] = new JLabel("オ)ワイヤー2を切断します。" ); 70 71 s[2][0] = new JLabel( "ア)一番下のワイヤーが黒く、かつシリアルナンバーの最後の桁が奇数なら、ワイヤー4を切ります"); 72 s[2][1] = new JLabel("イ)赤いワイヤーが一本だけ、かつ黄色いワイヤーが複数ある場合、ワイヤー1を切断します。"); 73 s[2][2] = new JLabel("ウ)黒いワイヤーがない場合、ワイヤー2を切断します。"); 74 s[2][3] = new JLabel("エ)ワイヤー1を切断します。" ); 75 76 s[3][0] = new JLabel("ア)黄色いワイヤーがなく、かつシリアルナンバーの最後の桁が奇数なら、ワイヤー3を切断します"); 77 s[3][1] = new JLabel("イ)黄色いワイヤーが一本だけ、かつ白いワイヤーが複数ある場合、ワイヤー4を切断します。"); 78 s[3][2] = new JLabel("ウ)赤いワイヤーがない場合、ワイヤー6を切断します。"); 79 s[3][3] = new JLabel("エ)ワイヤー4を切断します。"); 80 81 } 82 83 @Override 84 public void itemStateChanged(ItemEvent e) { 85 86 if (rb[0].isSelected()) { 87 for (int i = 0; i < 5; i++) { 88 if (i == 4) { 89 l[4].setText(""); 90 } else { 91 l[i].add(s[0][i]); 92 } 93 } 94 } else if (rb[1].isSelected()) { 95 for (int i = 0; i < 5; i++) { 96 l[i].add(s[1][i]); 97 } 98 } else if (rb[2].isSelected()) { 99 for (int i = 0; i < 5; i++) { 100 if (i == 4) { 101 l[4].setText(""); 102 } else { 103 l[i].add(s[2][i]); 104 } 105 } 106 } else if (rb[3].isSelected()) { 107 for (int i = 0; i < 5; i++) { 108 if (i == 4) { 109 l[4].setText(""); 110 } else { 111 l[i].add(s[3][i]); 112 } 113 } 114 } 115 for(int i=0; i<l.length; i++) { 116 p2.add(l[i]); 117 } 118 p.add(p2); 119 add(p); 120 p.repaint(); 121 }; 122 123 public static void main(String[] args) { 124 No1 f = new No1(); 125 126 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 127 f.setTitle("配線"); 128 f.setSize(760, 300); 129 f.setVisible(true); 130 } 131 132} 133

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

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

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

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

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

swordone

2017/06/14 14:54

コードマークダウンは'(SHIFT+7)ではなく`(SHIFT+@)です。
TakuyaAsaka

2017/06/14 14:56

編集しました。失礼しました
LouiS0616

2017/06/14 15:01

どういうときに上手く行って、どういうときに上手く行かないんですか?どういう風な動作を期待しているんですか?
TakuyaAsaka

2017/06/14 15:08

ラジオボタンからの入力でラベルへの出力をしたいのですが、ラジオボタンのみ表示され、他反応なしです。
LouiS0616

2017/06/14 15:10

addItemListenerは使っていますか?
LouiS0616

2017/06/14 15:13

メソッド自体は確かに呼び出されているんですか?
guest

回答2

0

レンダリング属性(色)付きの文字列(テキスト)を簡単に配置してリッチテキストのような表現としたいということですね。

###何も表示されない原因
JLabelへ別のJLabelをaddしているからです。itemStateChangedで、l[i].add(s[0][i])のようなコードとしていますが、l[i]はJLabelでs[0][i]もJLabelですね。addメソッドが定義されているのであたかもJLabelの子供コンポーネントとして別のJLabelが配置できるかのように思えてしまいますが、実際はできません(※1)。

###対処方法
色付きの文字列をJLabelで表現するという前提なら、それを配置する親コンポーネントl[i]はJPanelとします。JPanelのレイアウトはデフォルトのFlowLayoutでよいでしょう。
ボタンをクリックする度にテキストを置き換える必要がありますが、例えば次のようにする方法が考えられます。

java

1class ColorLabel extends JLabel { 2 ColorLabel(String text) { 3 super(text); 4 } 5 6 ColorLabel(String text, Color color) { 7 this(text); 8 setForeground(color); 9 } 10} 11 12public class No1 ... { 13 JPanel[] l = new JPanel[5]; 14 JLabel[][][] s = new JLabel[5][][]; //いわゆるジャグ配列にする 15 ... 16 No1() { 17 ... 18 for (int i = 0; i < l.length; i++) { 19 l[i] = new JPanel(); 20 p2.add(l[i]); 21 } 22 ... 23 s[0] = new JLabel[][] = { 24 { 25 new ColorLabel("ア)"), 26 new ColorLabel("赤いワイヤー", Color.RED), 27 new ColorLabel("ない場合、ワイヤー2を切断します。"), 28 }, 29 { new ColorLabel("イ)一番下のワイヤーが白い場合、そのワイヤーを切断します。") }, 30 { 31 new ColorLabel("ウ)"), 32 new ColorLabel("青いワイヤー", Color.BLUE), 33 new ColorLabel("が複数ある場合、青いワイヤーの中で一番下のものを切断します。"), 34 }, 35 ... 36 }; 37 s[1] = new JLabel[][] = { 38 ... 39 }; 40 ... 41 } 42 43 public void itemStateChanged(ItemEvent e) { 44 for (int buttonIndex = 0; buttonIndex < rb.length; buttonIndex++) { 45 if (rb[buttonIndex].isSelected()) { 46 for (int rowIndex = 0; rowIndex < l.length; rowIndex++) { 47 l[rowIndex].removeAll(); // 以前表示していたものを全て取り去る 48 if (rowIndex < s[buttonIndex].length) { 49 for (JLabel label : s[buttonIndex][rowIndex]) { 50 l[row].add(label); 51 } 52 } 53 } 54 } 55 } 56 // コンポーネント階層を変更したのでrevalidateを呼び出す 57 // revalidateはJPanelの下に配置した子供コンポーネントの位置や大きさや 58 // JPanel自身の大きさを全て再計算し適切に配置しなおしてくれる。 59 // またレイアウトしなおすことは表示内容が変わることを意味するので 60 // repaintを呼び出さなくてもswingが自動的に呼び出してくれる。 61 p2.revalidate(); 62 } 63}

補足1: 元のコードでは配列aに色を付けたJLabelがあらかじめ定義されているので、自分のコード例にあるnew ColorLabel("赤いワイヤー", Color.RED)の代わりにa[0]と書きたくなるかも知れません。しかしそれはお勧めしません。swingのコンポーネントはあるインスタンスを画面上の複数個所に配置できないからです。面倒でも個別にnew ColorLabel...のようにしてインスタンスを生成する必要があります。

補足2: 色付きのテキストをJLabelの並びで表現するのは最も素直な方法とはいえないかも知れません。JLabelの設定テキストにはHTML形式の文字列を指定できるので以下のようにするのも手段の一つになるかも知れません。
new JLabel("<html><head></head><body>ア)<font color='red'>赤いワイヤー</font>...")
またJTextPaneには色などの属性付きのテキストを表現できるのでそれを使うのも一つの方法ですが、いずれにしても若干面倒なコードになります。


※1: JLabelへaddメソッドがあるのに使ってはいけない理由
JLabelはswingにおける「子供を持たないコンポーネントクラス(=JComponent)」として定義されています。しかしJComponentは古いGUIライブラリーであるawtでの「子供を持てるコンテナークラス(=Container)」の派生として定義されています。
これはJComponentがawtの複数のComponentで構成されているという実装の都合によるもので、実際には「子供を配置してはいけないもの」です。addメソッドがコンパイルエラーにならずに呼び出せてしまう理由は単にJComponentがContainerの派生でありContainerにaddメソッドが定義されていたからなんですね。このあたりawt/swingの関係に注意していないとわかりにくいですね・・・(余談ですがJava8からの標準GUIライブラリーであるJavaFXは、swingとは継承関係がない新規のGUIライブラリーとして設計されており、こうしたいびつなインターフェース上の問題はなくなっています)

投稿2017/06/15 02:03

編集2017/06/15 03:09
KSwordOfHaste

総合スコア18394

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

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

0

簡単な修正で直りました。
文字列自体を扱う際は、JLabelではなくStringを用います。
つまり、質問者様が使っているlsをString型に変更してください。

この場合、lに関する処理を次のように変更することになります。
l[i].add(s[num][i]);l[i] += s[num][i];


また、同様のミスを減らすためにも、変数名を変えることを強くお勧めします。
今のコードでは、クラス名とリテラル以外の情報がほぼありません。
適切に命名しなおすか、適切なコメントを付けてください。

投稿2017/06/14 15:42

LouiS0616

総合スコア35660

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

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

TakuyaAsaka

2017/06/14 17:27 編集

Stringにした場合、色つけはどうなりますか?
LouiS0616

2017/06/14 18:06

例えば文字列に色を付けたいときは、その文字をJLabelに貼り付けてください。 前もってラベル配列coloredLabel[]を用意しておいて、 ```Java for(int i=0; i<coloredLabel.length; i++ ) { coloredLabel[i].setText(l[i]); coloredLabel[i].setForeground(Color.BLUE); // 例えばね p2.add(coloredLabel[i]); } ``` このとき予想されるエラーはいわゆるヌルポインタアクセスです。 それらしいエラーが出たときは、おそらくcoloredLabelのスコープの問題ですから、宣言する位置を変えて色々試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問