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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

2回答

962閲覧

Java Swingでラベルの描画がおかしくなる

michael-ilcsy

総合スコア180

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2018/05/10 09:08

某野球ゲームのミニゲームである地雷原を進むゲームを作り出したところです。
今はボタンを押すと格子状のラベルが描画されるコードを書いていました。

が、ボタンを押しても何の反応もせずウインドウを最小化して戻したり、タイトルバーをつかんでドラッグで描画部分を下に隠して戻したりすると正しく表示されます。
ボーダーが表示されてないだけで実際はそこに描画されてるのかなと思い背景色も変えたりしましたが、やはり表示部分を何らかの方法で隠して再表示しないと描画されません。

ボタンを押したらすぐ表示されるようにするにはどうすればいいのでしょうか?

↓ボタンを押しただけではこの格子が出ない↓
イメージ説明

java

1public class Mine { 2 public static void main(String[] args) { 3 Swing mine = new Swing("地雷ゲーム"); 4 Process.process = mine; //処理クラスに渡す 5 mine.setVisible(true); 6 mine.setLocationRelativeTo(null); 7 mine.setResizable(false); 8 } 9}

java

1import javax.swing.*; 2import java.awt.*; 3import javax.swing.border.*; 4import java.awt.event.*; 5import java.util.*; 6 7class Swing extends JFrame implements ActionListener{ 8 JButton[] difficultyBtns = new JButton[3]; 9 JPanel p1 = new JPanel(); 10 11 Swing(String title){ 12 setTitle(title); 13 setSize(800, 600); 14 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 p1 = new JPanel(); 16 p1.setLayout(null); 17 p1.setBounds(0, 0, 800, 600); 18 19 difficultyBtns[0] = new JButton("easy"); 20 difficultyBtns[1] = new JButton("normal"); 21 difficultyBtns[2] = new JButton("hard"); 22 23 difficultyBtns[0].setBounds(220, 10, 100, 30); 24 difficultyBtns[1].setBounds(350, 10, 100, 30); 25 difficultyBtns[2].setBounds(480, 10, 100, 30); 26 27 for (int i=0; i<3; i++) { 28 difficultyBtns[i].setLayout(null); 29 difficultyBtns[i].setBorder(new LineBorder(Color.black, 1, false)); 30 difficultyBtns[i].addActionListener(this); 31 difficultyBtns[i].setFont(new Font("メイリオ", Font.PLAIN, 18)); 32 difficultyBtns[i].setHorizontalAlignment(JLabel.CENTER); 33 difficultyBtns[i].setVerticalAlignment(JLabel.CENTER); 34 p1.add(difficultyBtns[i]); 35 } 36 difficultyBtns[0].setActionCommand("easy"); 37 difficultyBtns[1].setActionCommand("normal"); 38 difficultyBtns[2].setActionCommand("hard"); 39 40 add(p1); 41 } 42 43 public void actionPerformed(ActionEvent e){ 44 String cmd = e.getActionCommand(); 45 int difficulty = 0; 46 if(cmd.equals("easy")) { 47 difficulty = 11; 48 Process.makeBtnEasy(); 49 } else if (cmd.equals("normal")) { 50 difficulty = 21; 51 Process.makeBtnNormal(); 52 } else { 53 difficulty = 31; 54 } 55 Maze.s_main(difficulty); //穴掘り法で迷路を作るメソッド 全て拾い物 56 } 57}

java

1import javax.swing.*; 2import java.awt.*; 3import javax.swing.border.*; 4import java.awt.event.*; 5import java.util.*; 6 7public class Process { 8 public static Swing process = new Swing(""); 9 10 public static void makeBtnEasy() { //easyでの描画 11 JLabel[][] labels = new JLabel[9][9]; 12 13 for(int row=0; row<labels.length; row++) { 14 for(int col=0; col<labels[row].length; col++) { 15 labels[row][col] = new JLabel(); 16 labels[row][col].setBounds(265+(col*30),100+(row*30), 30, 30); 17 //labels[row][col].setLayout(null); 18 //↑これが関係してるかと思いコメントアウトしたが直らなかった 19 labels[row][col].setBorder(new LineBorder(Color.black, 1, false)); 20 process.p1.add(labels[row][col]); 21 } 22 } 23 } 24 25 public static void makeBtnNormal() { //normalでの描画 26 JLabel[][] labels = new JLabel[19][19]; 27 28 for(int row=0; row<labels.length; row++) { 29 for(int col=0; col<labels[row].length; col++) { 30 labels[row][col] = new JLabel(); 31 labels[row][col].setBounds(210+(col*20),100+(row*20), 20, 20); 32 //labels[row][col].setLayout(null); 33 labels[row][col].setBackground(Color.GREEN); //背景色設定してみたがダメだった 34 labels[row][col].setOpaque(true); 35 labels[row][col].setBorder(new LineBorder(Color.black, 1, false)); 36 process.p1.add(labels[row][col]); 37 } 38 } 39 } 40}

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

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

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

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

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

guest

回答2

0

質問にある実装方法ではボタンを押すたびにJLabelのインスタンスが追加されてしまうのでメモリが破綻します。あらかじめeasyPanelとnormalPanelを用意しておいて、それぞれに必要なJLabelを貼り付けます。これらのパネルは両方ともsetVisible(false)としておいて、ボタンが押されたときにいずれか一方をsetVisible(true)とします。

java

1public static void main(String[] args) { 2 Swing mine = new Swing("地雷ゲーム"); 3 mine.setVisible(true); 4 mine.setLocationRelativeTo(null); 5 mine.setResizable(false); 6}

java

1public class Swing extends JFrame implements ActionListener { 2 3 JButton[] difficultyBtns = new JButton[3]; 4 JPanel p1 = new JPanel(); 5 JPanel easyPanel = new JPanel(); 6 JPanel normalPanel = new JPanel(); 7 8 Swing(String title) { 9 setTitle(title); 10 setSize(800, 600); 11 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12 p1 = new JPanel(); 13 p1.setLayout(null); 14 p1.setBounds(0, 0, 800, 600); 15 16 difficultyBtns[0] = new JButton("easy"); 17 difficultyBtns[1] = new JButton("normal"); 18 difficultyBtns[2] = new JButton("hard"); 19 20 difficultyBtns[0].setBounds(220, 10, 100, 30); 21 difficultyBtns[1].setBounds(350, 10, 100, 30); 22 difficultyBtns[2].setBounds(480, 10, 100, 30); 23 24 for (int i = 0; i < 3; i++) { 25 difficultyBtns[i].setLayout(null); 26 difficultyBtns[i].setBorder(new LineBorder(Color.black, 1, false)); 27 difficultyBtns[i].addActionListener(this); 28 difficultyBtns[i].setFont(new Font("メイリオ", Font.PLAIN, 18)); 29 difficultyBtns[i].setHorizontalAlignment(JLabel.CENTER); 30 difficultyBtns[i].setVerticalAlignment(JLabel.CENTER); 31 p1.add(difficultyBtns[i]); 32 } 33 difficultyBtns[0].setActionCommand("easy"); 34 difficultyBtns[1].setActionCommand("normal"); 35 difficultyBtns[2].setActionCommand("hard"); 36 37 easyPanel.setLayout(null); 38 easyPanel.setBounds(0, 0, 600, 500); 39 easyPanel.setVisible(false); 40 JLabel[][] easyLabels = new JLabel[9][9]; 41 42 for(int row=0; row<easyLabels.length; row++) { 43 for(int col=0; col<easyLabels[row].length; col++) { 44 easyLabels[row][col] = new JLabel(); 45 easyLabels[row][col].setBounds(265+(col*30),100+(row*30), 30, 30); 46 easyLabels[row][col].setBorder(new LineBorder(Color.black, 1, false)); 47 easyPanel.add(easyLabels[row][col]); 48 } 49 } 50 p1.add(easyPanel); 51 52 normalPanel.setLayout(null); 53 normalPanel.setBounds(0, 0, 600, 500); 54 normalPanel.setVisible(false); 55 JLabel[][] normalLabels = new JLabel[19][19]; 56 57 for(int row=0; row<normalLabels.length; row++) { 58 for(int col=0; col<normalLabels[row].length; col++) { 59 normalLabels[row][col] = new JLabel(); 60 normalLabels[row][col].setBounds(210+(col*20),100+(row*20), 20, 20); 61 normalLabels[row][col].setBackground(Color.GREEN); //背景色設定してみたがダメだった 62 normalLabels[row][col].setOpaque(true); 63 normalLabels[row][col].setBorder(new LineBorder(Color.black, 1, false)); 64 normalPanel.add(normalLabels[row][col]); 65 } 66 } 67 p1.add(normalPanel); 68 69 add(p1); 70 71 } 72 73 public void actionPerformed(ActionEvent e) { 74 String cmd = e.getActionCommand(); 75 int difficulty = 0; 76 if (cmd.equals("easy")) { 77 difficulty = 11; 78 normalPanel.setVisible(false); 79 easyPanel.setVisible(true); 80 } else if (cmd.equals("normal")) { 81 difficulty = 21; 82 normalPanel.setVisible(true); 83 easyPanel.setVisible(false); 84 } else { 85 difficulty = 31; 86 } 87 Maze.s_main(difficulty); // 穴掘り法で迷路を作るメソッド 全て拾い物 88 } 89}

投稿2018/05/10 10:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

michael-ilcsy

2018/05/10 11:01

回答ありがとうございます! 仰るとおりeasyとnormalのラベルがバッティングして同時に表示されるので、makeBtnEasy内でまずラベルがすでにあるか調べて、あったら全部消してから描画とするようにしようと考えていましたが、回答のやり方のほうがすごくスマートなのでありがたく使わせていただきます!
guest

0

ベストアンサー

actionPerformedの最後でrepaint()を呼んでみてください。

某野球ゲームのミニゲームである地雷原を進むゲーム

パワポケ8ですかね。

投稿2018/05/10 09:15

LouiS0616

総合スコア35660

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

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

michael-ilcsy

2018/05/10 09:29

回答ありがとうございます! 情報を更新したらすぐに描画されるものだと思っていました。検索したときに再描画と書いてあるのを除いて調べていたのが馬鹿でした。 名前を出していいのかわからなかったですが、おっしゃるとおりパワポケ3,8の地雷ゲームです
LouiS0616

2018/05/10 09:34

私もSwingを触りはじめた時にハマった記憶があります。 --- > おっしゃるとおりパワポケ3,8の地雷ゲームです ですよね。パワポケはそれなりにやり込んだので懐かしいです。維織さん推しです。
michael-ilcsy

2018/05/10 09:48

javaも学び始めたところなのにGUIに手を出してひーひーいいながら都度基礎的な質問を投稿しているので、いつも申し訳ない気持ちがありましたが、ベテランの方も最初ハマったと聞いて少し安心しました(失礼) パワポケは7までやってましたが独特のブラック感が好きでした、彼女がさらわれたりするし。
KSwordOfHaste

2018/05/10 09:58 編集

> 情報を更新したらすぐに描画されるものだと思っていました。 その感覚はswingではなく他のGUIライブラリーでは正しい場合もあります。例えばJavaFXはそれに近いです(再描画メソッドがどのクラスにもなくなってるのです)。計算機の能力が上がるにつれ、プログラミングの手法が進むにつれ色々な方法論が「よりスマート」な方向に進んでますので、swing時代には必要だった再描画がもうあまり必要とされなくなったのかも知れません。
michael-ilcsy

2018/05/10 10:07

>例えばJavaFXはそれに近いです そうなんですね!使っているノートPCが超低スペックでeclipseを入れられないのでswingでやっているのですが、もうすぐ買い換えてeclipseを入れてJavaFXの勉強もしようと思っているのでその時は苦労しなくてすみそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問