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

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

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

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

Q&A

解決済

2回答

3148閲覧

色のついたPanelの上にLabelの配置

sobue

総合スコア329

Java

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

0グッド

0クリップ

投稿2016/06/05 13:14

編集2016/06/07 23:32

イメージ説明

java

1public class Picross extends JFrame implements ActionListener { 2 3 int[][] questionarray = new int[MASS][MASS]; 4 5 public Picross() { 6 Board board = new Board(); 7 8 JPanel btnpanel = new JPanel(); 9 JButton btn = new JButton("問題選択"); 10 JButton answerbtn = new JButton("答え合わせ"); 11 12 JPanel labelpanel = new JPanel(); 13 JLabel label = new JLabel("テスト"); 14 15 // フォームの設定 16 setTitle("ピクロス"); 17 setDefaultCloseOperation(EXIT_ON_CLOSE); 18 19 // 問題選択ボタンの設定 20 btn.addActionListener(this); 21 btnpanel.add(btn); 22 23 // ピクロスの数字を表示するラベルの設定 24 board.add(labelpanel); 25 labelpanel.add(label); 26 27 // 答え合わせボタンの設定 28 answerbtn.addActionListener(this); 29 btnpanel.add(answerbtn); 30 31 // ボタンの位置の設定 32 add(btnpanel, BorderLayout.SOUTH); 33 34 35 // ピクロスのボードの位置を設定 36 add(board, BorderLayout.CENTER); 37 38 39 // 全てをまとめる 40 pack(); 41 } 42 43

ピクロスの要である数字をラベルにて出力したいのですが、boardに描いた絵に隠れてしまっているのか、うまくいきません。
btnpanelのところであれば表示されたのですが・・・。
お手数ですが、宜しくお願いします。

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

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

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

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

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

dsuzuki

2016/06/06 02:57

悩んでいるのは具体的にソースのどこでしょうか。 メソッドselectQuestion内のファイル読み込み処理?
dsuzuki

2016/06/10 03:16

描画している(Boardの)コードがないとどんな描画をしているかわからないため、助言が出来ません。質問変更前のコードのままでしょうか。
sobue

2016/06/10 06:01

質問変更前と同じです
guest

回答2

0

JLabelを使用する必要性がないなら、GraphicsのdrowStringメソッドで文字列を描画することが出来ます。

投稿2016/06/10 03:21

dsuzuki

総合スコア1682

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

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

sobue

2016/06/10 06:02

逆にグラフィックで描けるなら、ラベルとの違いとはなんでしょうか?
dsuzuki

2016/06/10 08:16

個人的意見ですが、他の部品とのレイアウトを調整したいならJLabel、単純に描くだけならGraphics、ですね。 今回の件では、数字を表示する項目はJLabelとするのがわかりやすいと思いますが、元のソースコードでは全体をGraphicsで作成されているのでdrowStringを提案しました。
sobue

2016/06/11 10:52

せっかく回答いただきましたが、今回はLabelにて出力したかったので今後の参考にさせていただきます。
guest

0

自己解決

java

1package newPicross; 2 3import static newPicross.CommonConst.*; 4import java.awt.Color; 5import java.awt.Dimension; 6import java.awt.Graphics; 7import java.awt.event.ActionEvent; 8import java.awt.event.ActionListener; 9import java.awt.event.MouseEvent; 10import java.awt.event.MouseListener; 11import java.io.BufferedReader; 12import java.io.FileReader; 13import java.util.StringTokenizer; 14 15import javax.swing.JButton; 16import javax.swing.JFileChooser; 17import javax.swing.JFrame; 18import javax.swing.JLabel; 19import javax.swing.JLayeredPane; 20import javax.swing.JPanel; 21 22/* 23 * 24 */ 25public class Picross extends JFrame implements ActionListener { 26 27 int[][] questionarray = new int[MASS][MASS]; 28 JLabel[] sideLabels = new JLabel[MASS]; 29 JLabel[] verticalLabels = new JLabel[MASS]; 30 31 public Picross() { 32 Board board = new Board(); 33 34 JPanel btnpanel = new JPanel(); 35 JButton btn = new JButton("問題選択"); 36 JButton answerbtn = new JButton("答え合わせ"); 37 38 JPanel sideLabelPanel = new JPanel(); 39 JPanel verticalLabelPanel = new JPanel(); 40 41 42 setLayout(null); 43 board.setBackground(Color.WHITE); 44 // フォームの設定 45 setTitle("ピクロス"); 46 setDefaultCloseOperation(EXIT_ON_CLOSE); 47 48 // 問題選択ボタンの設定 49 btn.addActionListener(this); 50 btnpanel.add(btn); 51 52 //Labelを配置するためのPanelのセット(横) 53 sideLabelPanel.setLayout(null); 54 sideLabelPanel.setBounds(0,MARGIN+SIZE, MARGIN+SIZE, SIZE*(MASS-1)); 55 sideLabelPanel.setOpaque(false); 56 add(sideLabelPanel); 57 58 // ピクロスの数字を表示するラベルの設定(横) 59 for(int i = 1;i < MASS;i++){ 60 sideLabels[i] = new JLabel(); 61 sideLabels[i].setBounds(5, (SIZE*(i-1)), MARGIN, SIZE); 62 sideLabels[i].setText("test" + i); 63 sideLabelPanel.add(sideLabels[i]); 64 } 65 66 //Labelを配置するためのPanelのセット(縦) 67 verticalLabelPanel.setLayout(null); 68 verticalLabelPanel.setBounds(MARGIN+SIZE,0, WI-MARGIN-SIZE, MARGIN+SIZE); 69 verticalLabelPanel.setOpaque(false); 70 add(verticalLabelPanel); 71 72 // ピクロスの数字を表示するラベルの設定(縦) 73 for(int i = 1;i < MASS;i++){ 74 verticalLabels[i] = new JLabel(); 75 } 76 77 78 79 80 // 答え合わせボタンの設定 81 answerbtn.addActionListener(this); 82 btnpanel.add(answerbtn); 83 84 // ボタンの位置の設定 85 btnpanel.setBounds(0, 440, 440, 100); 86 add(btnpanel); 87 88 89 // ピクロスのボードの位置を設定 90 board.setBounds(0, 0, WI, HI); 91 add(board); 92 93 94 // 全てをまとめる 95 pack(); 96 } 97 98 @Override 99 public void actionPerformed(ActionEvent e) { 100 101 if (e.getActionCommand().equals("問題選択")) { 102 // 問題選択ボタン 103 104 // 問題を選択する 105 selectQuestion(); 106 } else if (e.getActionCommand().equals("答え合わせ")) { 107 // 答え合わせボタン 108 } 109 } 110 111 private void selectQuestion() { 112 113 int x = 1; 114 int y = 1; 115 116 JFileChooser fileChooser = new JFileChooser(); 117 // OpenDialogを表示させる 118 int selected = fileChooser.showOpenDialog(this); 119 120 // 開くを選択した場合 121 if (selected == JFileChooser.APPROVE_OPTION) { 122 try { 123 FileReader fileReader = new FileReader(fileChooser.getSelectedFile()); 124 BufferedReader bufferedReader = new BufferedReader(fileReader); 125 126 String line; 127 StringTokenizer token; 128 129 while ((line = bufferedReader.readLine()) != null) { 130 token = new StringTokenizer(line, ","); 131 while (token.hasMoreTokens()) { 132 133 if (token.nextToken().equals("1")) { 134 questionarray[x][y] = 1; 135 } else { 136 questionarray[x][y] = 0; 137 } 138 139 if (x == MASS - 1) { 140 x = 1; 141 y++; 142 } else { 143 x++; 144 } 145 } 146 } 147 bufferedReader.close(); 148 // 選択したファイルを読み込む 149 } catch (Exception e2) { 150 // TODO: handle exception 151 } 152 } 153 154 // 縦の読み込み 155 vertical(); 156 // 横の読み込み 157 side(); 158 } 159 160 private void side() { 161 162 int shaveCount = 0; 163 String shaveString = ""; 164 165 for (int y = 1; y < MASS; y++) { 166 for (int x = 1; x < MASS; x++) { 167 168 if (questionarray[x][y] == 1) { 169 shaveCount++; 170 } else { 171 if (shaveCount > 0) { 172 173 shaveString = shaveString.trim() + shaveCount + " "; 174 shaveCount = 0; 175 } else { 176 shaveString = shaveString.trim() + " "; 177 shaveCount = 0; 178 } 179 180 } 181 if (x == MASS - 1) { 182 if (shaveString.trim().length() == 0) { 183 sideLabels[y].setText("0"); 184 } else { 185 sideLabels[y].setText(shaveString); 186 } 187 shaveString = ""; 188 } 189 } 190 } 191 192 } 193 194 private void vertical() { 195 196 } 197 198 /** 199 * 200 * ピクロスの盤面 201 * 202 */ 203 static class Board extends JLayeredPane implements MouseListener { 204 205 int[][] boardarray = new int[MASS][MASS]; 206 207 public Board() { 208 setPreferredSize(new Dimension(WI, HI)); 209 addMouseListener(this); 210 211 } 212 213 public void paint(Graphics graphi) { 214 215 graphi.setColor(Color.WHITE); 216 // ボードの下地を描く 217 graphi.fillRect(0, 0, HI, WI); 218 219 graphi.setColor(Color.BLACK); 220 // ピクロスのマスの線を引く 221 for (int i = 1; i <= MASS; i++) { 222 // 横線 223 graphi.drawLine(0, i * SIZE + MARGIN, WI, i * SIZE + MARGIN); 224 // 縦線 225 graphi.drawLine(i * SIZE + MARGIN, 0, i * SIZE + MARGIN, HI); 226 } 227 228 // 削った場所と戻した場所と削ってはいけない場所の色付け 229 for (int x = 1; x < MASS; x++) { 230 for (int y = 1; y < MASS; y++) { 231 232 if (boardarray[x][y] == SHAVED) { 233 // 削った場所 234 graphi.setColor(Color.BLACK); 235 graphi.fillRect(x * SIZE + MARGIN, y * SIZE + MARGIN, SIZE, SIZE); 236 237 } else if (boardarray[x][y] == BANSHAVED) { 238 // 削ってはいけない場所 239 graphi.setColor(Color.RED); 240 graphi.drawLine(x * SIZE + MARGIN, y * SIZE + MARGIN, (x + 1) * SIZE + MARGIN, 241 (y + 1) * SIZE + MARGIN); 242 graphi.drawLine(x * SIZE + MARGIN, (y + 1) * SIZE + MARGIN, (x + 1) * SIZE + MARGIN, 243 y * SIZE + MARGIN); 244 245 } else { 246 // 元に戻した場所 247 graphi.setColor(Color.WHITE); 248 } 249 250 } 251 } 252 } 253 254 @Override 255 public void mouseClicked(MouseEvent e) { 256 // TODO 自動生成されたメソッド・スタブ 257 258 } 259 260 @Override 261 public void mousePressed(MouseEvent e) { 262 263 int x = (e.getX() - MARGIN) / SIZE; 264 int y = (e.getY() - MARGIN) / SIZE; 265 266 if ((x > 0 && y > 0) && (x < MASS && y < MASS)) { 267 268 if (e.getClickCount() == 1) { 269 // クリック時 270 if (boardarray[x][y] == 0) { 271 boardarray[x][y] = SHAVED; 272 } else { 273 boardarray[x][y] = INIT; 274 } 275 276 } else if (e.getClickCount() == 2) { 277 // ダブルクリック時 278 boardarray[x][y] = BANSHAVED; 279 } 280 // 再描画する 281 repaint(); 282 } 283 284 } 285 286 @Override 287 public void mouseReleased(MouseEvent e) { 288 // TODO 自動生成されたメソッド・スタブ 289 290 } 291 292 @Override 293 public void mouseEntered(MouseEvent e) { 294 // TODO 自動生成されたメソッド・スタブ 295 296 } 297 298 @Override 299 public void mouseExited(MouseEvent e) { 300 // TODO 自動生成されたメソッド・スタブ 301 302 } 303 304 } 305 306 public static void main(String[] args) { 307 Picross board = new Picross(); 308 board.setVisible(true); 309 } 310 311} 312

setLayout(null);を入れることと
Boardの継承をPanelからJLayeredPaneにすることによって解決しました。

投稿2016/06/11 10:51

sobue

総合スコア329

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問