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

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

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

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

Swing

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

Q&A

解決済

1回答

538閲覧

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

tazachi

総合スコア13

Java

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

Swing

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

0グッド

1クリップ

投稿2017/12/18 14:18

###前提・実現したいこと
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で作成

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

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

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

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

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

umyu

2017/12/18 14:46

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

2017/12/18 15:58

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

2017/12/18 16:03

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

2017/12/18 16:07

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

回答1

0

自己解決

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

投稿2017/12/18 16:09

tazachi

総合スコア13

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

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

KSwordOfHaste

2017/12/18 19:33

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

2017/12/18 23:23

KSwordOfHasteさん 実際に試したわけではないですが、apiドキュメント等を見たところ、JComponentはある意味不完全で、機能によってはサブクラスに依存するものもあるようです。 setBackgroundなんかがそうみたいで、JComponentから派生させると、サブクラスでそれを実装する必要があるみたいです。 ですので、やはりJPanelを継承したほうが無難みたいですよ。 ここで、その件に関して論争してました。 http://www.javaroad.jp/bbs/answer.jsp?q_id=20101107132104165
KSwordOfHaste

2017/12/19 04:45 編集

ご指摘ありがとうござます。ご指摘のとおり、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に左右されてしまう点などは利点にもなりますが欠点にもなるのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問