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

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

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

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

Q&A

解決済

2回答

1116閲覧

フレーム内にJPEG画像を表示させたい

yomoanyan

総合スコア14

Java

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

0グッド

0クリップ

投稿2021/12/28 06:36

前提・実現したいこと

簡単なレースゲーム(と言ってもまだレの字もないですが)を作成している途中です。

View.java内のfillRectの位置に自分のPCのデスクトップにある画像を表示させたいです。

次のサイトを参考にして以下のようにView.javaを書きました。しかし、表示されません。
【Java】ウィンドウに画像を描画する

なぜこの書き方だとうまくいかないのでしょうか?またどのように直せば良いのでしょうか?

MVCモデルを元に作成しています。

よろしくお願いします。

作成したコード

ビュー

Java

1/*--- View.java ---*/ 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.*; 5import java.util.*; 6 7// ビュー(モデルが変化したら自動で画面を書き換える) 8class View extends JPanel implements Observer { 9 private Model model; 10 11 public View(Model model, Controller cont) { 12 this.model = model; 13 this.model.addObserver(this); 14 this.addKeyListener(cont); 15 this.setFocusable(true); //キー入力を受け付けるため 16 } 17 public void paintComponent(Graphics g) { 18 super.paintComponent(g); 19 model.draw(g); // 車を描画 20 drawItem(g); 21 } 22 public void update(Observable o, Object arg) { 23 this.repaint(); 24 } 25 26 private void drawItem(Graphics g) { 27 String item; 28 Image img; 29 g.setColor(Color.BLUE); 30 g.fillRect(400, 0, 100, 100); 31 g.fillOval(99, 99, 4, 4); // アイテムの表示切り替わりの目印 32 g.fillOval(400, 400, 50, 50); // ワープポイントの目印 33 int n = model.return_item(model.getX(), model.getY()); 34 if(n == 0) { 35 item = "0"; 36 img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); 37 Font font = new Font("Arial", Font.BOLD, 30); 38 g.setColor(Color.RED); 39 g.setFont(font); 40 } else { 41 item = "1"; 42 img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); 43 Font font = new Font("Arial", Font.BOLD, 30); 44 g.setColor(Color.RED); 45 g.setFont(font); 46 } 47 g.drawString(item, 420, 50); 48 //g.drawImage(img, 400, 0, 100, 100, this); 49 } 50} 51 52

コントローラ

Java

1/*---Controller.java ---*/ 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.*; 5 6// コントローラ(キー入力) 7class Controller implements KeyListener { 8 protected Model model; 9 protected boolean fwd = false; // Fキー(前進)の入力履歴 10 11 public Controller(Model model) { 12 this.model = model; 13 } 14 15 CarController carcontroller = new CarController(); 16 UseItem useitem = new UseItem(); 17 public void keyPressed(KeyEvent e) { 18 carcontroller.keyPressed(e); 19 useitem.keyPressed(e); 20 } 21 public void keyTyped(KeyEvent e) { 22 carcontroller.keyTyped(e); 23 useitem.keyTyped(e); 24 } 25 public void keyReleased(KeyEvent e) { 26 carcontroller.keyReleased(e); 27 useitem.keyReleased(e); 28 } 29 30 class CarController implements KeyListener{ 31 public void keyPressed(KeyEvent e) { 32 /* この記述だとカーブ後にFキーを押し直さないと前進できない */ 33 int key = e.getKeyCode(); 34 35 if(key == KeyEvent.VK_F) { 36 model.accel(10, 10); 37 model.warp(-100, -100); // ワープに入ると移動する 38 fwd = true; 39 } 40 else if(key == KeyEvent.VK_RIGHT) { 41 model.right(); // 右に方向転換 42 if(fwd == true) { 43 model.right(); 44 model.accel(10, 10); // アクセルを踏みながら右に曲がる 45 } 46 } else if(key == KeyEvent.VK_LEFT) { 47 //model.new CarMovement().left(); // 左に方向転換 48 model.left(); 49 if(fwd == true) { 50 model.left(); 51 model.accel(10, 10); // アクセルを踏みながら左に曲がる 52 } 53 } 54 } 55 public void keyReleased(KeyEvent e) { 56 int key = e.getKeyCode(); 57 58 if(key == KeyEvent.VK_F) { 59 fwd = false; // Fキーの入力が止まったら前進の履歴をfalseに 60 } 61 } 62 public void keyTyped(KeyEvent e) {} 63 } 64 65 class UseItem implements KeyListener { 66 public void keyPressed(KeyEvent e) { 67 68 int key = e.getKeyCode(); 69 int item = model.return_item(model.getX(), model.getY()); // item[ 0:ダッシュ, 1:弾 70 boolean canuse = true; 71 72 if(key == KeyEvent.VK_A) { 73 canuse = false; 74 if(item == 0) { 75 model.dash(30, 30); 76 } else if(item == 1) { 77 //model.launcher(); //まだない 78 } 79 } 80 81 } 82 83 public void keyReleased(KeyEvent e) {} 84 public void keyTyped(KeyEvent e) {} 85 86 } 87}

モデル

Java

1/*--- Model.java ---*/ 2 3import javax.swing.*; 4import java.awt.*; 5import java.awt.geom.*; // 図形の回転に必要 6import java.util.*; 7 8// モデル(車の位置・角度の管理) 9class Model extends Observable { 10 private int w, h; // 画面の大きさ 11 private int x = 25; // 車の中心のX座標 12 private int y = 25; // 車の中心のY座標 13 private int angle = 0; // 車の角度(0:右、正の値:右回転) 14 protected int speed_x = 0, speed_y = 0; 15 private Road road = new Road(); 16 17 public Model(int w, int h) { 18 this.w = w; 19 this.h = h; 20 } 21 22 23 /*--------------- 車の動きの制御 -------------------*/ 24 25 public void moveFwd(int fwd_x, int fwd_y) { 26 // 角度に応じてちょっと進む 27 double x2 = x + fwd_x * Math.cos(Math.toRadians(angle)); 28 double y2 = y + fwd_y * Math.sin(Math.toRadians(angle)); 29 // 当たり判定 30 if (road.inside(x2, y2)) { 31 // 移動後の車が道路上だったら状態を更新 32 x = (int)x2; 33 y = (int)y2; 34 setChanged(); 35 notifyObservers(); 36 } 37 } 38 39 public void right() { 40 angle += 10; // 右回転 41 if (angle > 180) {angle -= 360;} 42 setChanged(); 43 notifyObservers(); 44 } 45 46 public void left() { 47 angle -= 10; // 左回転 48 if (angle <= -180) {angle += 360;} 49 setChanged(); 50 notifyObservers(); 51 } 52 public void accel(int accel_x, int accel_y) { 53 speed_x = accel_x; 54 speed_y = accel_y; 55 moveFwd(speed_x, speed_y); 56 } 57 58 public int getX() { return x; } 59 public int getY() { return y; } 60 61 /*----------------- アイテムまわり --------------------*/ 62 63 public int return_item(int x, int y) { // とりあえず、100 <= x, 100 <= y の場所にいる時にコロコロ変わる 64 int n = 0; 65 if((x >= 100) && (y >= 100)) { 66 n = item(); 67 } 68 return n; 69 } 70 71 private int item() { 72 double r = Math.random(); 73 if((0 <= r) && (r <= 0.5)) { 74 return 1; 75 } else { 76 return 0; 77 } 78 } 79 80 public void dash(int x, int y) { 81 accel(x, y); 82 } 83 84 85 /*-------------------- ギミックまわり ------------------------*/ 86 87 public void warp(int warp_x, int warp_y){ 88 if(x >= 400 && x <= 450 && y >= 400 && y <= 450){ 89 moveFwd(warp_x, warp_y); 90 } 91 } 92 93 94 95 96 public void draw(Graphics g) { 97 // 図形を回転させる処理 98 Graphics2D g2 = (Graphics2D)g; 99 AffineTransform at = g2.getTransform(); 100 at.setToRotation(Math.toRadians(angle), x, y); 101 g2.setTransform(at); 102 g2.setColor(Color.red); 103 g2.fillRect(x - 10, y - 5, 20, 10); 104 105 at.setToIdentity(); 106 g2.setTransform(at); 107 108 road.draw(g); // 道路を描画 109 } 110 public int getW() {return w;} 111 public int getH() {return h;} 112}

Java

1//Road.java 2 3import javax.swing.*; 4import java.awt.*; 5import java.util.*; 6 7class Road { 8 private ArrayList<Shape> shapes; // 図形の集合 9 // Shapeインターフェイスを実装している図形を登録可能 10 11 public Road() { 12 shapes = new ArrayList<Shape>(); 13 // 図形を追加 14 shapes.add(new Rectangle( 10, 10,250, 30)); 15 shapes.add(new Rectangle(230, 10, 30,250)); 16 shapes.add(new Rectangle(230,230,250, 30)); 17 shapes.add(new Rectangle(450,230, 30,250)); 18 shapes.add(new Rectangle( 10,450,470, 30)); 19 shapes.add(new Rectangle( 10, 10, 30,470)); 20 } 21 public void draw(Graphics g) { 22 g.setColor(new Color(100, 100, 100, 50)); 23 Graphics2D g2 = (Graphics2D)g; 24 25 for (Shape shape: shapes) { 26 g2.fill(shape); 27 } 28 } 29 public boolean inside(double x, double y) { 30 for (Shape shape: shapes) { 31 if (shape.contains(x, y)) { 32 return true; 33 } 34 } 35 return false; 36 } 37}

上のコードを実行した

###参考にさせてもらったコード

Java

1import java.awt.*; 2import javax.swing.*; 3 4public class Test{ 5 public static void main(String[] args) { 6 GameWindow gw = new GameWindow("テストウィンドウ",400,300); 7 DrawCanvas dc = new DrawCanvas(); 8 gw.add(dc); 9 gw.setVisible(true); 10 } 11} 12class GameWindow extends JFrame{ 13 14 public GameWindow(String title, int width, int height) { 15 super(title); 16 setDefaultCloseOperation(EXIT_ON_CLOSE); 17 setSize(width,height); 18 setLocationRelativeTo(null); 19 //gw.setResizable(false); // この記述がコンパイル通らないのでコメントアウトしました 20 } 21} 22class DrawCanvas extends JPanel{ 23 Image img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); 24 public void paintComponent(Graphics g) { 25 super.paintComponent(g); 26 //画像の表示 27 g.drawImage(img, 0, 0, 100, 100, this); 28 } 29}

表示されたもの

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

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

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

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

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

jimbe

2021/12/28 08:54

モデルなど気にせず、まず最低限必要な機能・クラスを設計して作成しては如何でしょうか。 ざっくり見る限り、"モデル" を意識する以前に構造なりクラス(オブジェクト)関係なりをもう少し意識されたほうが良いように思えます。
guest

回答2

0

自己解決

画像をデスクトップではなくコードをまとめているフォルダの下におけば表示されました。

投稿2021/12/28 16:55

yomoanyan

総合スコア14

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

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

0

Model#draw()

java

1class Model { 2 public void draw(Graphics g) { 3 AffineTransform at = g2.getTransform(); 4 at.setToRotation(Math.toRadians(angle), x, y); 5 g2.setTransform(at); 6 ... 7 at.setToIdentity(); 8 g2.setTransform(at);

Graphics2D#setTransform()のドキュメントに従ってみてはどうかと。

警告:このメソッドは新しい座標変換を既存の変換上で適用する目的では決して使用しないでください。

java

1 // Get the current transform 2 AffineTransform saveAT = g2.getTransform(); 3 // Perform transformation 4 g2d.transform(...); 5 // Render 6 g2d.draw(...); 7 // Restore original transform 8 g2d.setTransform(saveAT);

投稿2021/12/28 07:53

shiketa

総合スコア3971

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問