teratail header banner
teratail header banner
質問するログイン新規登録
Java

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

Q&A

解決済

1回答

748閲覧

クイズゲームに背景画像を表示する方法を教えてください

taku_ro21

総合スコア1

Java

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

0グッド

0クリップ

投稿2022/01/20 08:59

0

0

前提・実現したいこと

javaでクイズゲームに背景として全体に画像を表示したまま、ゲームをプレイできるようにしたいです。

発生している問題

画像が一部しか表示されなかったり、クイズゲームが消えてしまったりします。

試したこと

public void paint(Graphics g) {
g.drawImage(img, 10, 30,500,500, this);
}
で画像を表示しました。

補足

windows,vscodeを使用しています。
初歩的なミスかもしれませんが、よろしくお願いします。

該当のソースコード

Java

1import java.awt.*; 2import java.awt.BorderLayout; 3import java.awt.CardLayout; 4import java.awt.Color; 5import java.awt.Dimension; 6import java.awt.event.ActionListener; 7import java.awt.event.WindowEvent; 8import java.util.ArrayDeque; 9import java.util.Arrays; 10import java.util.Collections; 11import java.util.Deque; 12import java.util.List; 13 14import java.io.IOException; 15import javax.imageio.ImageIO; 16import javax.swing.ImageIcon; 17import javax.swing.JButton; 18import javax.swing.JComponent; 19import javax.swing.JFrame; 20import javax.swing.JLabel; 21import javax.swing.JPanel; 22 23 24 25public class QuizGame3 extends JFrame { 26 Image img = getToolkit().getImage("フォルダ名/ファイル名"); 27 28 public static void main(String[] args){ 29 new QuizGame3("NOBUクイズ", 500, 500); 30 } 31 32 33 public void paint(Graphics g) { //画像描画メソッド 34 g.drawImage(img, 10, 30,500,500, this); 35 } 36 37 38 static private class Quiz { 39 String question; //問題文 40 String[] answers; //選択肢 41 String correct; //正解 42 Quiz(String question, String[] answers) { 43 this(question, answers, 0); 44 } 45 Quiz(String question, String[] answers, int correctNo) { 46 this.question = question; 47 this.answers = shuffle(answers); 48 this.correct = answers[correctNo]; 49 } 50 private static String[] shuffle(String[] array) { 51 List<String> a = Arrays.asList(array.clone()); 52 Collections.shuffle(a); 53 return a.toArray(new String[array.length]); 54 } 55 } 56 57 static private Quiz[] quizArray = { 58 new Quiz("ドラえもんに登場するスネ夫の苗字は?", 59 new String[]{"骨川", "馬川"}), 60 new Quiz("ドラえもんの好物はどら焼き、では妹のドラミちゃんの好物は?", 61 new String[]{"メロンパン", "チョコレートパン"}), 62 new Quiz("硬式テニスで0点の事を2文字で何と言うでしょう?", 63 new String[]{"ラブ", "レイブ"}), 64 new Quiz("パソコンのコンはコンピュータの略。ではパソの略は?", 65 new String[]{"パーソナル", "ターミナル"}), 66 new Quiz("ばいきんまんが愛用しているロボットの名前は?", 67 new String[]{"だだんだん", "どどんどん"}), 68 }; 69 70 private Deque<Quiz> quizStack = new ArrayDeque<Quiz>(); 71 private Quiz quiz; //出題中のクイズ 72 73 static private final int ANSWERS_SIZE = 2; 74 private JLabel questionLabel; 75 private JButton[] answerButtons = new JButton[ANSWERS_SIZE]; 76 private SouthPanel southPanel; 77 78 public QuizGame3(String title, int width, int height) { 79 super(title); 80 setVisible(true); 81 setSize(width, height); 82 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 83 setResizable(false); 84 85 JPanel headerPanel = new JPanel(); 86 headerPanel.setBackground(Color.BLACK); 87 headerPanel.setPreferredSize(new Dimension(500,50)); 88 add(headerPanel, BorderLayout.NORTH); 89 90 questionLabel = new JLabel(""); 91 questionLabel.setHorizontalAlignment(JLabel.CENTER); 92 add(questionLabel, BorderLayout.CENTER);//中心に問題を表示 93 94 JPanel answerPanel = new JPanel(); 95 for(int i=0; i<answerButtons.length; i++) { 96 answerButtons[i] = new JButton(); 97 answerButtons[i].addActionListener(e -> { 98 decide(((JButton)e.getSource()).getText()); 99 }); 100 answerPanel.add(answerButtons[i]); 101 } 102 103 southPanel = new SouthPanel(answerPanel, e->drawQuiz(), e->end()); 104 add(southPanel, BorderLayout.SOUTH); 105 106 //クイズをシャッフルして山にする 107 List<Quiz> quizList = Arrays.asList(quizArray.clone()); 108 Collections.shuffle(quizList); 109 quizStack.addAll(quizList); 110 111 drawQuiz(); 112 } 113 114 //下部の表示を進行状況に応じて切り替える 115 static private class SouthPanel extends JPanel { 116 117 118 enum Card { 119 ANSWER, //回答 120 NEXT, //次の問題へ 121 END //全問終了 122 }; 123 124 private CardLayout southCard; 125 126 SouthPanel(JComponent answer, ActionListener nextActionListener, ActionListener endActionListener) { 127 super(null); 128 southCard = new CardLayout(); 129 setLayout(southCard); 130 131 add(answer, Card.ANSWER.name()); 132 133 JButton nextButton = new JButton("次へ"); 134 nextButton.addActionListener(nextActionListener); 135 add(nextButton, Card.NEXT.name()); 136 137 JButton endButton = new JButton("終了"); 138 endButton.addActionListener(endActionListener); 139 add(endButton, Card.END.name()); 140 } 141 142 void show(Card card) { 143 southCard.show(this, card.name()); 144 } 145 } 146 147 private void end() { 148 dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); 149 } 150 151 //山からクイズを引き, 表示する. 152 private void drawQuiz() { 153 quiz = quizStack.pollFirst(); 154 155 southPanel.show(SouthPanel.Card.ANSWER); 156 157 questionLabel.setText(quiz.question); 158 questionLabel.setForeground(Color.red); 159 for(int i=0; i<answerButtons.length; i++) { 160 answerButtons[i].setText(quiz.answers[i]); 161 } 162 } 163 164 //判定 165 private void decide(String answer) { 166 if(answer.equals(quiz.correct)){ 167 questionLabel.setText("正解"); 168 questionLabel.setForeground(Color.PINK); 169 }else{ 170 questionLabel.setText("不正解"); 171 questionLabel.setForeground(Color.DARK_GRAY); 172 } 173 174 southPanel.show(quizStack.isEmpty() ? SouthPanel.Card.END : SouthPanel.Card.NEXT); 175 } 176}

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

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

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

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

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

m.ts10806

2022/01/20 09:32

どういう規格の画像を載せようとしているのでしょうか。 載せようとしているパネルより画像が大きかったり、重ね順の問題に見えますが、 そのあたりはどこまで認識(もしくは検証)されていますか?
taku_ro21

2022/01/20 11:00

反応していただきありがとうございます。 画像はJPEGを使っています。 ゲームの上に背景画像が上乗せされている状態だと考え、以下のサイトを参考に画像の透過をためしたのですが、画像が表示されませんでした。https://oshiete.goo.ne.jp/qa/8697589.html ほかに考えられる原因を理解できていない状況です。 初心者のため理解が浅いですが、よろしくお願いいたします。
m.ts10806

2022/01/20 11:28

質問は編集できますので適宜追記してください。
m.ts10806

2022/01/20 11:29

>画像はJPEGを使っています。 いえ、拡張子や圧縮形式ではなく、ファイルサイズ、縦横幅のことです。
guest

回答1

0

ベストアンサー

JFrame の paint では super.paint(g) を呼び出す必要があると思います。
ただ、JFrame の paint はウインドウ全体を描画しますので、ウインドウタイトルやエッジ等を考慮する必要があり、結構面倒では無いでしょうか。

可能であれば、背景を含んでゲーム画面としてパネル化し、そのパネルを JFrame に設定して、 JFrame の paint は触らないほうが良いように思います。

コンストラクタのみ(JFrame のオーバーライトしていた paint() はコメント化)

java

1 public QuizGame3(String title, int width, int height) { 2 super(title); 3 //setVisible(true); //setVisible は最後に行うこと 4 setSize(width, height); 5 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 6 setResizable(false); 7 8 JPanel background = new JPanel(new BorderLayout()) { 9 @Override 10 protected void paintComponent(Graphics g) { 11 super.paintComponent(g); 12 g.drawImage(img, 0, 0,500,500,this); 13 } 14 }; 15 add(background); 16 17 JPanel headerPanel = new JPanel(); 18 headerPanel.setBackground(Color.BLACK); 19 headerPanel.setPreferredSize(new Dimension(500,50)); 20 background.add(headerPanel, BorderLayout.NORTH); 21 22 questionLabel = new JLabel(""); 23 questionLabel.setHorizontalAlignment(JLabel.CENTER); 24 background.add(questionLabel, BorderLayout.CENTER);//中心に問題を表示 25 26 JPanel answerPanel = new JPanel(); 27 for(int i=0; i<answerButtons.length; i++) { 28 answerButtons[i] = new JButton(); 29 answerButtons[i].addActionListener(e -> { 30 decide(((JButton)e.getSource()).getText()); 31 }); 32 answerPanel.add(answerButtons[i]); 33 } 34 35 southPanel = new SouthPanel(answerPanel, e->drawQuiz(), e->end()); 36 background.add(southPanel, BorderLayout.SOUTH); 37 38 //クイズをシャッフルして山にする 39 List<Quiz> quizList = Arrays.asList(quizArray.clone()); 40 Collections.shuffle(quizList); 41 quizStack.addAll(quizList); 42 43 drawQuiz(); 44 45 setVisible(true); 46 }

投稿2022/01/20 11:05

編集2022/01/20 11:24
jimbe

総合スコア13357

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

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

taku_ro21

2022/01/20 13:05

丁寧に答えていただきありがとうございます。 無事、解決しました。 この場合、paintは使わない方がよいのですね。勉強になりました。 また、setVisibleのミスも自分で見つけられなかったので、ご指摘いただけて良かったです。 本当にありがとうございました。
jimbe

2022/01/20 13:25

setVisible に関しましては、本当に"ベスト"にするには main メソッドのほうを書き換えないといけないのですが、個人的に"ベター"として setVisible を main メソッドの最後のタイミングで実行するようにしています。(main の書き換えは大した量では無いのですが ^^;) 書き換えは次の記事が具体的です。 [mainメソッドでSwingを書かない訳] https://torutk.hatenablog.jp/entry/20060928/p2
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問