前提・実現したいこと
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}
どういう規格の画像を載せようとしているのでしょうか。
載せようとしているパネルより画像が大きかったり、重ね順の問題に見えますが、
そのあたりはどこまで認識(もしくは検証)されていますか?
反応していただきありがとうございます。
画像はJPEGを使っています。
ゲームの上に背景画像が上乗せされている状態だと考え、以下のサイトを参考に画像の透過をためしたのですが、画像が表示されませんでした。https://oshiete.goo.ne.jp/qa/8697589.html
ほかに考えられる原因を理解できていない状況です。
初心者のため理解が浅いですが、よろしくお願いいたします。
質問は編集できますので適宜追記してください。
>画像はJPEGを使っています。
いえ、拡張子や圧縮形式ではなく、ファイルサイズ、縦横幅のことです。

回答1件
あなたの回答
tips
プレビュー