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

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

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

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

解決済

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

yomoanyan
yomoanyan

総合スコア7

Java

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

2回答

0評価

0クリップ

425閲覧

投稿2021/12/28 06:36

前提・実現したいこと

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

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

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

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

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

よろしくお願いします。

作成したコード

ビュー

Java

/*--- View.java ---*/ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; // ビュー(モデルが変化したら自動で画面を書き換える) class View extends JPanel implements Observer { private Model model; public View(Model model, Controller cont) { this.model = model; this.model.addObserver(this); this.addKeyListener(cont); this.setFocusable(true); //キー入力を受け付けるため } public void paintComponent(Graphics g) { super.paintComponent(g); model.draw(g); // 車を描画 drawItem(g); } public void update(Observable o, Object arg) { this.repaint(); } private void drawItem(Graphics g) { String item; Image img; g.setColor(Color.BLUE); g.fillRect(400, 0, 100, 100); g.fillOval(99, 99, 4, 4); // アイテムの表示切り替わりの目印 g.fillOval(400, 400, 50, 50); // ワープポイントの目印 int n = model.return_item(model.getX(), model.getY()); if(n == 0) { item = "0"; img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); Font font = new Font("Arial", Font.BOLD, 30); g.setColor(Color.RED); g.setFont(font); } else { item = "1"; img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); Font font = new Font("Arial", Font.BOLD, 30); g.setColor(Color.RED); g.setFont(font); } g.drawString(item, 420, 50); //g.drawImage(img, 400, 0, 100, 100, this); } }

コントローラ

Java

/*---Controller.java ---*/ import javax.swing.*; import java.awt.*; import java.awt.event.*; // コントローラ(キー入力) class Controller implements KeyListener { protected Model model; protected boolean fwd = false; // Fキー(前進)の入力履歴 public Controller(Model model) { this.model = model; } CarController carcontroller = new CarController(); UseItem useitem = new UseItem(); public void keyPressed(KeyEvent e) { carcontroller.keyPressed(e); useitem.keyPressed(e); } public void keyTyped(KeyEvent e) { carcontroller.keyTyped(e); useitem.keyTyped(e); } public void keyReleased(KeyEvent e) { carcontroller.keyReleased(e); useitem.keyReleased(e); } class CarController implements KeyListener{ public void keyPressed(KeyEvent e) { /* この記述だとカーブ後にFキーを押し直さないと前進できない */ int key = e.getKeyCode(); if(key == KeyEvent.VK_F) { model.accel(10, 10); model.warp(-100, -100); // ワープに入ると移動する fwd = true; } else if(key == KeyEvent.VK_RIGHT) { model.right(); // 右に方向転換 if(fwd == true) { model.right(); model.accel(10, 10); // アクセルを踏みながら右に曲がる } } else if(key == KeyEvent.VK_LEFT) { //model.new CarMovement().left(); // 左に方向転換 model.left(); if(fwd == true) { model.left(); model.accel(10, 10); // アクセルを踏みながら左に曲がる } } } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_F) { fwd = false; // Fキーの入力が止まったら前進の履歴をfalseに } } public void keyTyped(KeyEvent e) {} } class UseItem implements KeyListener { public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); int item = model.return_item(model.getX(), model.getY()); // item[ 0:ダッシュ, 1:弾 boolean canuse = true; if(key == KeyEvent.VK_A) { canuse = false; if(item == 0) { model.dash(30, 30); } else if(item == 1) { //model.launcher(); //まだない } } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} } }

モデル

Java

/*--- Model.java ---*/ import javax.swing.*; import java.awt.*; import java.awt.geom.*; // 図形の回転に必要 import java.util.*; // モデル(車の位置・角度の管理) class Model extends Observable { private int w, h; // 画面の大きさ private int x = 25; // 車の中心のX座標 private int y = 25; // 車の中心のY座標 private int angle = 0; // 車の角度(0:右、正の値:右回転) protected int speed_x = 0, speed_y = 0; private Road road = new Road(); public Model(int w, int h) { this.w = w; this.h = h; } /*--------------- 車の動きの制御 -------------------*/ public void moveFwd(int fwd_x, int fwd_y) { // 角度に応じてちょっと進む double x2 = x + fwd_x * Math.cos(Math.toRadians(angle)); double y2 = y + fwd_y * Math.sin(Math.toRadians(angle)); // 当たり判定 if (road.inside(x2, y2)) { // 移動後の車が道路上だったら状態を更新 x = (int)x2; y = (int)y2; setChanged(); notifyObservers(); } } public void right() { angle += 10; // 右回転 if (angle > 180) {angle -= 360;} setChanged(); notifyObservers(); } public void left() { angle -= 10; // 左回転 if (angle <= -180) {angle += 360;} setChanged(); notifyObservers(); } public void accel(int accel_x, int accel_y) { speed_x = accel_x; speed_y = accel_y; moveFwd(speed_x, speed_y); } public int getX() { return x; } public int getY() { return y; } /*----------------- アイテムまわり --------------------*/ public int return_item(int x, int y) { // とりあえず、100 <= x, 100 <= y の場所にいる時にコロコロ変わる int n = 0; if((x >= 100) && (y >= 100)) { n = item(); } return n; } private int item() { double r = Math.random(); if((0 <= r) && (r <= 0.5)) { return 1; } else { return 0; } } public void dash(int x, int y) { accel(x, y); } /*-------------------- ギミックまわり ------------------------*/ public void warp(int warp_x, int warp_y){ if(x >= 400 && x <= 450 && y >= 400 && y <= 450){ moveFwd(warp_x, warp_y); } } public void draw(Graphics g) { // 図形を回転させる処理 Graphics2D g2 = (Graphics2D)g; AffineTransform at = g2.getTransform(); at.setToRotation(Math.toRadians(angle), x, y); g2.setTransform(at); g2.setColor(Color.red); g2.fillRect(x - 10, y - 5, 20, 10); at.setToIdentity(); g2.setTransform(at); road.draw(g); // 道路を描画 } public int getW() {return w;} public int getH() {return h;} }

Java

//Road.java import javax.swing.*; import java.awt.*; import java.util.*; class Road { private ArrayList<Shape> shapes; // 図形の集合 // Shapeインターフェイスを実装している図形を登録可能 public Road() { shapes = new ArrayList<Shape>(); // 図形を追加 shapes.add(new Rectangle( 10, 10,250, 30)); shapes.add(new Rectangle(230, 10, 30,250)); shapes.add(new Rectangle(230,230,250, 30)); shapes.add(new Rectangle(450,230, 30,250)); shapes.add(new Rectangle( 10,450,470, 30)); shapes.add(new Rectangle( 10, 10, 30,470)); } public void draw(Graphics g) { g.setColor(new Color(100, 100, 100, 50)); Graphics2D g2 = (Graphics2D)g; for (Shape shape: shapes) { g2.fill(shape); } } public boolean inside(double x, double y) { for (Shape shape: shapes) { if (shape.contains(x, y)) { return true; } } return false; } }

上のコードを実行した

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

Java

import java.awt.*; import javax.swing.*; public class Test{ public static void main(String[] args) { GameWindow gw = new GameWindow("テストウィンドウ",400,300); DrawCanvas dc = new DrawCanvas(); gw.add(dc); gw.setVisible(true); } } class GameWindow extends JFrame{ public GameWindow(String title, int width, int height) { super(title); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(width,height); setLocationRelativeTo(null); //gw.setResizable(false); // この記述がコンパイル通らないのでコメントアウトしました } } class DrawCanvas extends JPanel{ Image img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); public void paintComponent(Graphics g) { super.paintComponent(g); //画像の表示 g.drawImage(img, 0, 0, 100, 100, this); } }

表示されたもの

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jimbe

2021/12/28 08:54

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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