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

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

ただいまの
回答率

90.51%

  • Java

    13836questions

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

  • Swing

    227questions

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

java GUIでの画像反転表示にPC画面が写りこむ

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 265

tazachi

score 7

前提・実現したいこと

javaのGUIについての質問です。
eclipsで画像を左右・上下反転させて表示するプログラムを作成しているのですが、なにも表示していないはずの部分になぜかPC画面が写されてしまいます。
この原因は何ですか?
おそらくdrawImageの引数が正常ではないことが関係していると思うのですが解決方法が分かりません。
どなたかご教授ください。
よろしくお願いします。

(プログラムはPC画面が写されることを確認するため、上下左右反転時の処理をコメントアウトしています。)

発生している問題・エラーメッセージ

生成されるウィンドウにPCの画面の一部が映ってしまう。

該当のソースコード

java

package p13;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class testMyImage2 extends JFrame{

static BufferedImage image;
static int width;
static int height;

public static void main(String[] args) {
File f = null;
if(args.length <= 0) {
System.out.println("画像読み込みエラー");
System.exit(1);;
}
/*画像読み込み*/
try {
f = new File(args[0]);
image = ImageIO.read(f);
System.out.println("読み込み完了");
}catch(IOException e) {
System.out.println(e);
}
width = image.getWidth();
height = image.getHeight();

/*フレームの作成*/
testMyImage2 tMI = new testMyImage2();
tMI.setSize(width*2, height*2);
tMI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tMI.setVisible(true);

}

public void paint(Graphics g){
g.drawImage(image,0,0,width,height,this);
g.drawImage(image,width,0,width*2,height, width,0,0,height,this);//左右反転
g.drawImage(image,0,height,width,height*2, 0,height,width,0,this);//上下反転
//g.drawImage(image,width,height,width*2,height*2, width,height,0,0,this);//上下左右反転
}
}

試したこと

通常表示の場合は問題なし。
一枚でも反転画像を表示するとPC画面が写される。

補足情報(言語/FW/ツール等のバージョンなど)

java eclipsで作成

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • umyu

    2017/12/18 23:46

    もしも参考にした書籍やサイトがあるなら、そのサイトは参考にしないでください。1,大原則としてSwingで独自のpaint処理を行いたい時は、paintComponentをオーバーライドします。2,paintComponent内で描画処理を記述します。3,オーバーライドしたpaintComponentメソッドの先頭行で、super.paintComponent(g);を呼び出します。

    キャンセル

  • tazachi

    2017/12/19 00:58

    そうなのですね、javaを始めたばかりなので知りませんでした。継承をJPanelにし、新しく宣言したJFrameの上に乗せ、教えていただいた通りにpaintComponentをオーバーライドしたら無事に表示できました。初歩的な質問でしたがお答えくださりありがとうございます。

    キャンセル

  • umyu

    2017/12/19 01:03

    がんばってくださいなー。。あ、質問が解決したのでしたら、解決内容を回答欄に記述して、質問を閉じてくださると、あとあと検索で質問を見た人が参考にできるかとー

    キャンセル

  • tazachi

    2017/12/19 01:07

    何から何までありがとうございます。そうさせて頂きます。またご縁があればよろしくお願いします。

    キャンセル

回答 1

check解決した方法

+2

クラスの拡張をJPanelにし、新しく宣言したJFrameの上に乗せ、paintComponentをオーバーライドする。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 04:33

    JPanelは「子供コンポーネントを配置する目的で用いるコンテナー」として使うものですので、子コンポーネントを配置しないならJPanelよりJComponentの派生にした方がより自然に見えると思います。細かい点ではありますが。

    キャンセル

  • 2017/12/19 08:23

    KSwordOfHasteさん

    実際に試したわけではないですが、apiドキュメント等を見たところ、JComponentはある意味不完全で、機能によってはサブクラスに依存するものもあるようです。
    setBackgroundなんかがそうみたいで、JComponentから派生させると、サブクラスでそれを実装する必要があるみたいです。

    ですので、やはりJPanelを継承したほうが無難みたいですよ。

    ここで、その件に関して論争してました。

    http://www.javaroad.jp/bbs/answer.jsp?q_id=20101107132104165

    キャンセル

  • 2017/12/19 13:43 編集

    ご指摘ありがとうござます。ご指摘のとおり、JComponentの派生として作るのが自然というのは不適切でしたね!

    本質問においては「画像を表示する目的で使いやすい基底クラスは何か」なのでJPanelが使いやすいのは確かだと思います。「JComponentを規定クラスとして選んだ方が自然」というコメントは「Look&Feelも含めたswingとしての再利用可能な独自コンポーネントを定義する場合に自然」とでも言うべきでした。

    例えばご指摘の通りJComponentには「Look&Feelを決めるUIがインストールされない」ためオーバーライドしたpaintComponentメソッドでsuperのpaintComponentを呼び出しても背景の塗りつぶしが行われません。そのためswingのコンポーネントとしてJPanelと同様に振舞わせたいならコンストラクターで

    setUI(new ComponentUI() {}); // 特別なLook&Feelを持たないという意味

    としておくか、paintComponentで自前でfillRectにより背景を塗りつぶすといったことをしなければなりません。

    自分はこれまで画像を表示するといった単純部品を定義する際にJComponentの派生として定義し、背景の塗りつぶしが必要ならfillRectを用いていました。(大抵の場合背景は透明として考えるのでfillRect自体もせずにすませることの方が多かったです)

    そうした実装は、Look&Feelの可変にすることはあまり気にせずそのアプリケーション用の間に合わせの「中途半端なswingコンポーネント定義」であり「充分な実装か?」といえば否と言わざるを得ません。JPanelの派生として定義した方がずっと簡単にそれなりの機能を備えたコンポーネントにできますね!そういう意味で本件についてのコメントとして不適切だったと思います。

    中途半端なコメントをしてしまい申し訳ありませんでした!

    なお、ご提示いただいたページでの議論は質問者さんがJPanelとJComponentを具象クラスとして利用するという文脈での議論になっているような気がします。そういう意味では微妙にフォーカスしている点が違うように感じます。独自コンポーネントを定義する際の基底クラスしての比較なら少し違った議論もあり得るのではないでしょうか?例えばJPanelから派生するとLook&FeelはあくまでJPanelに左右されてしまう点などは利点にもなりますが欠点にもなるのではないでしょうか。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    java スクロールバーの配置について

    画像を傾けて表示させるプログラムを作成しました 続けてフレームの右と下にスクロールバーを配置させたいのですがどうすればよいのかがわかりません。よろしくお願いします。 impor

  • 受付中

    Java アイコンを取得するプログラム

    指定のファイルのアイコンをJavaのプログラムから取得したいのですが、どのようなプログラムを作成したらいいのでしょうか。 他のサイトでは、ドラッグを使用しているのですが、ドラッグ

  • 解決済

    URLで画像オブジェクトを指定、それをGUIで表示させる方法

    javaを用いてGUIの開発をしています。 現在はプログラム起動時にURLで指定した画像を1枚貼ることが出来ています。 その画像をボタンを押すことで別のURLで指定された画像に

  • 解決済

    国旗を表示させたい(続き)

    前提・実現したいこと btn [0][1][2]をクリックすると、それに対応した国旗が表示されるようにしたい。 ソースコード import java.awt.*;   

  • 受付中

    javaで画像が表示されない

    45行目のnew java.swing.ImageIcon(s4)を46行目のs3が入っているところにそのまま new java.swing.JLabel (new java

  • 解決済

    javaで特定の文字を打った時JLabelに画像表示したい

    textFieldに文字"test"と打った時 JLabelに画像test.jpgを表示したいです

  • 受付中

    【Java】画像のリサイズについて

    Javaを用いて画像のリサイズを行いたいです。 現状はリサイズはできているのですが、 リサイズ後の画質が悪く、画質の劣化が少ない方法を探しております。 リサイズの参考にし

  • 受付中

    java apllet 音源再生

    番号リスト 音楽をappletで再生したい. ボタンstart stopをつけ動作させたい。 実行したこと 形式wmv サイズ55.0 MB (57,710,783 バイト) 音

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

  • Java

    13836questions

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

  • Swing

    227questions

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