ベストアンサー Appletのpublic void paint(Graphics g) 2003/12/26 17:03 は抽象クラスのGraphicsのオブジェクトを引数に持ちますが抽象クラスはオブジェクトを発生できないのに何故オブジェクトを渡せるのでしょうか? みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー UKY ベストアンサー率50% (604/1207) 2003/12/26 18:17 回答No.1 実際にパラメータとして渡されるのは、Graphicsのサブクラスのインスタンスだからです。 Graphics クラスは抽象クラスですが、そのサブクラスは抽象クラスとは限りません。 質問者 お礼 2003/12/26 18:30 ありがとうございます。 Appletの場合そのクラスは具体的に例えばどのようなクラスでしょうか? 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (1) liar_adan ベストアンサー率48% (730/1515) 2003/12/27 13:46 回答No.2 実際に渡されるのは、 GraphicsのサブクラスであるGraphics2Dの、 さらにサブクラスの、 各ウィンドウシステムごとに特化したクラスのオブジェクトです。 それは、たとえばWindowsなら Windowsの画面描画APIとJavaのグラフィック処理をとりもつクラスであり、 Linux等なら、X Window Systemの描画とJavaをとりもつクラスです。 こういうふうに、抽象化したクラスのインスタンスを 渡せるというのが、 とりもなおさずオブジェクト指向です。 たとえで話しますが… 寄せ鍋のレシピで「野菜と、肉と、白身の魚を入れる」とあったとします。 魚屋に行って 「白身の魚をください」 「鱈でいいですか?」 「いえ、鱈ではありません。 純粋に白身の魚そのものが欲しいのです!」 と言っても売ってくれません。 「白身の魚」と言えば鱈やアンコウのことであり、 そのうちのどれでもかまわないという意味です。 Javaの場合、環境間での互換性を重要視するので、 環境によって違うグラフィック処理はプログラマに見せたくありません。 そのためここは抽象クラスを使っています。 また、この機能(抽象化およびポリモーフィズム)により、 オブジェクト指向プログラムが他の手法より柔軟な構造になるのです。 質問者 お礼 2003/12/27 15:24 ありがとうございます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Java 関連するQ&A public void paint(Graphics g){ public void paint(Graphics g){ g.setColor(new Color(ci, ci, ci)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.WHITE); g.drawString("Canvas表示", 20, 20); g.drawImage(image, x1, y1, this); g.drawImage(image1, x2, y2, this); } public void update(Graphics g){ paint(g); } public void run(){ //while(true)で永久ループ //imageの座標を変更する処理 //repaint(); } スレッドを使ってイメージの座標を変更し、イメージが動くプログラムを作りました。 これだと滑らかに動かないからpaintメソッドをもうひとつ作って 処理するpaintと描画するpaintとにわけたらいいと言われました。 ですがやりかたがわからないので教えてください。 Javaの習得に向けたグラフィックスについて Javaの習得に向けて学習する場合、ひとえにオブジェクトがどういう風なものなのかを習得するということが主眼になると思います。クラス,メソッド,クラスの継承とか,クラス間での変数のスコープ(これは全言語で共通の学習)とかです。ファイル入出力、ループ、分岐なども全言語共通的なので翻訳可能であり、学習の対象ですらないもののように思えます。 しかし、グラフィカル(GUIを生成して、ブラウザで見せたりする)なところになると急激に視界不良のような印象になります。長い名前のコマンドでイベントリスナーとかフレームとかのオブジェクトとかラジオボタンをペタペタ貼り付けるとかです。それらのグラフィックスの機能というのは、Java独特のクラスとかオブジェクトの学習と関連しているのかどうかわかりにくくなる印象を持ちます。Javaの学習とあのグラフィックスは切り離して考えるのか、それともJavaの学習の結果その応用としてグラフィックス関係の処理が出てくるのか不明な感じになります。もし後者なら学習した内容に照らし合わせた機能と考えて納得させる必要がありますが、前者ならあんまり気にしないでブラックボックスとして処理するということになりそうです。Javaのグラフィックスはどのように理解して学習すればいいのでしょうか。 例えばVisual BasicなどはオブジェクトをGUI的に作ってウィンドウ上に貼り付けてその機能をコード化するということになるので、もう少しわかりやすいというか整理して(分業というか)して処理できそうですが、Javaは全部コード化するので理解しにくい印象があります。たとえばコードがあってその横にグラフィックスが示されているなら、もう少しマシなのですが。Javaの入門書では全くグラフィックスに触れないものあり、それだと通読しやすいです。グラフィックスが出てくると急激に歩みが遅くなるのですが。考え方について教えて頂きたいと思います。 よろしくお願いします。 Graphicsからの画像出力 今javaで音場シミュレーションを行っているのですが、音場解析結果の Image を Graphics2D に変換し、JFreeChart で生成した時刻歴、FFTなどの結果を Graphics2D に グラフで貼り付けています。 Graphics2D g2 は以下のよう |--------| |音場結果| |--------| |グラフ6コ| |--------| 今これを画像出力したいのです。 調べると Image クラスのオブジェクトであれば、 ImageIO.write(image, "jpeg", new File(fileName)); のようにして出力できるようですが、Graphics(2D) から画像出力は可能でしょうか。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 例外の再スロー時に、その原因となった例外はどう渡す? 今まではJavaを主に使っていたのですが、最近Rubyを使い始めた者です。 rescue節で例外を捕捉し、例外が発生した状況などの補足情報を新しい例外オブジェクトに付加して、より抽象度の高い例外として再スローしたいと思っています。 しかし困ったことに、Rubyの例外クラスでは、JavaのExceptionクラスのようにcauseを引数に渡して例外オブジェクトを生成することはできないようです。 Rubyではこのような場合、どのような方法で例外の情報を新しい例外オブジェクトに引き継ぐのが一般的なのでしょうか? よろしくお願いいたします。 Graphics等のイメージの描画 こんばんわ。 GraphicsクラスのdrawImageメソッドをつかっているですが 描画したあとでイメージだけを消す方法はあるのでしょうか。 APIはみてみましたがGraphicsクラスにはないようでした。 消すとしたら画面全体を消すのしかわからなく、使い勝手が悪いので困ってます。 ちなみにauのオープンアプリを作ろうとしているのでCLDCで使えるのを教えてください。 よろしくお願いします。 オブジェクト指向で分からないことが。 オブジェクト指向で分からないことが。 1.クラスAから、文字列引数を指定して、クラスBがインスタンス化されたオブジェクトを取得する。 (getInstance的メソッド)引数の文字列にマッピングされたオブジェクトを取得する感じ。 2.1.で取得したオブジェクトから、各オブジェクトを取得するメソッドを呼び出し、オブジェクトを取得する。(仮にクラスC) 3.2.で取得したクラスCのメソッドを呼び出す。 このとき、クラスCのメソッド内で、1.で利用された引数を利用したいです。 そもそもクラスCは、1.を経てしか取得されないものの為、再度1.の引数を渡したくありません。 内部的な値なので、スコープpublicのセッターを用意して、クラスA内からの書き換えが出来ては困ります。 こういう場合、どういうクラス設計を行えば良いのでしょうか? Graphicsプロパティ 例えば using System; using System.Drawing; using System.Windows.Forms; class SeparateMain { public static void Main() { Application.Run(new AnotherHelloWorld()); } } class AnotherHelloWorld : Form { public AnotherHelloWorld() { Text = "Another Hello World"; BackColor = Color.White; } protected override void OnPaint(PaintEventArgs pea) { Graphics grfx = pea.Graphics; grfx.DrawString("Hello, windows Forms!", Font, Brushes.Black, 0, 0); } } の中の Graphics grfx = pea.Graphics; という部分なのですが、この部分はなぜ必要で、何をしてるのでしょう。 GDI+というのでしょうか System.Drawing.Graphicsというクラスのインスタンス、grfxを定義して、 PaintEventArgsのインスタンスpeaのGraphicsプロパティを代入 この処理が必要な理由がわかりません。お願いします。 super.paint(g)を呼び出す意味が理解できません。 super.paint(g)を呼び出す意味が理解できません。 お早うございます、JAVAの初心者です、基本的な内容が理解出ずに悩んでいます。 宜しくお願い致します。 以下のプログラムを書いてやりました、「Sample1」は、public void paint(Graphics g)で オーバライドしてやると、そのまま”java”が表示されますが、JFrameTestでは、 public void paint(Graphics g)のなかに「super.paint(g)」を書いてやらないと、 一応windowは表示はされるのですが、パネルが透明になって下の文字とか、 画像が見えてしまいます。(何故か文法エラーにはなりません) しかし、public void paint(Graphics g)の内に「super.paint(g)」を書いてやると、 普通通り表示されます。 この違いというか原因はなになのでしょうか。 「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、 何故ここで必要なのでしょうか。 「Sample1」との違いが分かりません、何とぞ宜しくお願い致します。 ======================================================= public class Sample1 extends Applet { public void paint(Graphics g) { g.drawString("java",10,10); } } ============================================================ public class JFrameTest extends JFrame { JFrameTest() { setSize(400,300); setTitle("JFrameTest"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.setVisible(true); } } C#のGraphicsクラスについて(GDI+) 以下のようにgraphicsクラスをつかった画像の描画をおこないました。 Graphics gr = Graphics.FromImage(mapObj); というふうにからのリソースからGraphicsオブジェクトをつくる方法です。 using System; using System.IO; using System.Windows.Forms; using System.Drawing; using System.Web; using System.Net; using System.Text; using System.Threading; using System.ComponentModel; public class MainClass{ public static void Main(string [] args){ NewForm formObj = new NewForm(); formObj.RenderMethod(); Application .Run(formObj); } } public class NewForm : Form{ public NewForm(){ this.Width = 500; this.Height = 500; } public void RenderMethod(){ Bitmap mapObj = new Bitmap(500,500); Graphics gr = Graphics.FromImage(mapObj); Image imageObj = Image.FromFile("C:\\test.jpg"); gr .DrawImage(imageObj, 0,0,150,150); this.BackgroundImage = mapObj; } } このほかに、フォームコントロールの thisl.CreateGraphics()という メソッドを使っても画像を描画できるとききました。 あるサンプルをみると public class NewForm : Form{ public NewForm(){ this.Width = 500; this.Height = 500; } public void RenderMethod(){ Graphics gr = this.CreateGraphics(); Image imageObj = Image.FromFile("C:\\test.jpg"); gr .DrawImage(imageObj, 0,0,150,150); } } とこのようにthis.CreateGraphics()をつかっていましたが 実際にはこれが描画されないのです。 Graphics gr = Graphics.FromImage(mapObj); というGraphicsクラスの静的メソッドを使う方法ではなく コントロールのCreateGraphicsメソッドをつかって描画するにはどうしたらよいのですか? 識者のかた、ご教授ください。 PBoxのGraphicsをImageに書き込む お世話になります PictureBoxを2枚使用して以下の様に現状はなっております。 PictureBox AAは背景となる画像を描画 AA->Image = bmpGazou; PictureBox BBはAAのオーバーレイとして、文字や図形をGraphicsオブジェクトに描画したり編集したりしています。 主にg->FillEllipse等で円を描画しています ※文字や図形以外は透過 やりたいこと 保存用のBMPを作成して、そこにAAとBBを書き込んで、Jpeg保存したい 保存用BMPを定義して Bitmap^ bmp = gcnew Bitmap(ixSize, iySize); Graphics^ g = Graphics::FromImage(bmp); そこにAAを書き込む g->DrawImage(AA->Image,・・・ ここまでは正常にできたのですが、 BBのImageプロパティが未定義なので、g->DrawImageではBBを書き込めませんでした。 GraphicsオブジェクトをBMPに上書き(重ね書き)したいのですが、 どの様にすればよいのか教えていただけないでしょうか。 ↓等も見てはいるのですが、前提条件のBBの使い方が違うので、やり方が判りませんでした。 http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html ※PCの画面上はAAの上にBBが表示され、背景のAA画像に文字や図形を重ねて描画できております。 paint()以外でサブ関数を作りたい 今晩は、java初心者です、宜しくお願いします。 下の様なウインドウに文字を書くサブ関数を作りましたが、うまく実行出来ません。 しかし、public void paint( Graphics g){ }の中に書いてやるとうまく文字が表示されます。 何故か理由が分かりません。 public void paint( Graphics g ){ }は、Componentクラスのメッソドをオーバーライドしている だけなので、別名のサブ関数で「Graphics g」を引数にとれば同じ考えだと思うのですが、 実行出来ない理由が理解できません。 public void drawLetter( Graphics g )としても、エラーが出るばかりです。 その原因が分かりません、宜しくお願いします。 ==================================================================== public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } ============================================================= public class P1 extends Applet { public void init() { setBackground( Color.cyan ) ; setSize( 600 , 600 ) ; drawLetter( ) ; } public void drawLetter( ) { Graphics aa = getGraphics() ; aa.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; aa.setColor( Color.green ) ; aa.drawString( "String" , 0 , 0 ) ; } public void paint( Graphics g ) { g.setColor( Color.RED ) ; g.drawOval( 300 , 300 , 70 , 70 ) ; g.setColor( Color.RED ) ; g.fillOval( 200 , 200 , 30 , 30 ) ; /* g.setFont( new Font( "MS ゴシック" , Font.BOLD , 15 ) ) ; g.setColor( Color.BLUE ) ; g.drawString( "Orbit" , 50 , 50 ) ; */ } } ======================================================================= voidの性質や使い方、showメソッドについて 1ファイル1クラスの原則に反しますが、敢えて1ファイルに2クラスあるプログラムにおいて、voidの性質や使い方、showメソッド等について教えてほしいです。 ファイル名はStart.javaです。 --------------------------------- package sample; class Cat { String name; int age; void show(String name,int age) { System.out.println("名前は" + name + "です"); System.out.println("年齢は" + age + "歳です"); } } public class Start { public static void main(String[] args) { Cat cat1 = new Cat(); cat1.name = "太郎"; cat1.age = 28; cat1.show(); } } --------------------------------- 「cat1.show();」のところでエラーが出ていますが、Eclipseでそのまま実行してみますと。 ~~~~~~~~~~~~~~~~~~~ Exception in thread "main" java.lang.Error: Unresolved compilation problem: 型 Cat のメソッド show(String, int) は引数 () に適用できません at sample.Start.main(Start.java:16) ~~~~~~~~~~~~~~~~~~~ といったエラーが出てきます。しかし、Catクラスの「void show(String name,int age) 」の箇所を「void show() 」のように、Startクラスと同じく引数の中身を空にしますと。 |||||||| 名前は太郎です 年齢は28歳です |||||||| と、正しい結果が出力されたのです。 最初のプログラムは、Catクラスのshowメソッドには引数があり、Startメソッドのshowメソッドには引数が無い状態でした。 修正したプログラムでは、どちらのクラスのshowメソッドにも引数はありませんでした。 最初のプログラムでも、mainメソッドを実行して、nameとageに値を格納して、showメソッドでCatクラスの方で定義したshowメソッドを呼び出すといった流れで、正しい値は出るはずだと自分は考えたのですが。 なぜエラーになってしまったのか、どうして2つのクラスのshowメソッドの引数が空だとうまく結果が出力されたかにつきまして、お教えいただけないでしょうか。 よろしくお願い致します。 ※OKWAVEより補足:「Webシステム開発」についての質問です。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 抽象クラスのオブジェクトを生成できない理由は? ・抽象クラスは、なぜ(オーバーライドしないと)オブジェクトを生成できないのでしょうか? ・インタフェースみたいに、抽象メソッドしか宣言することができないなら話は分かるのですが… ・抽象メソッドでない普通のメソッドを実装できるのなら、オブジェクトを生成してくれても良いと思うのですが… ・そういう問題ではない? Appletのrepaint()が動作しません import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか? グラフィックスとゲーム用グラフィックスの違い vistaの「パフォーマンスの評価と改善」に表示されている「グラフィックス」と「ゲーム用グラフィックス」の違いがよくわかりません。 検索すると 「グラフィックス」は画面の解像度や色数に関係があるみたいですね。 「ゲーム用グラフィックス」はそのまんまですげど3D画像の処理の早さを示しているようですね。 ゲーム以外の画面表示に関しては全てグラフィックスのスコアを参考にしていいですか? パソコン購入検討ですが、用途は「DVD視聴」「フォトショップ・イラストレータ」「動画編集」を考えています。 AMD 690G オンボードグラフィックスとWXGA AMD 690Gチップセット搭載のPCで、オンボードグラフィックスを使用するのですが、これは1440x900のWXGAに対応していますでしょうか? vc++,sdi上でGraphicsクラスを有効に microsoft vc++ 2022上でsdi開発しているのですがGraphicsクラスを有効にする方法がわかりません。どなたか教えていただけないでしょう(OnDrawでコード書き込み) javaのpaintについて public class Main extends JFrame{ public static void main(String args[]){ Main frame = new Main("test"); frame.setVisible(true); } Main(String title){ setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menubar = new JMenuBar(); JMenu menu1 = new JMenu("File"); menubar.add(menu1); JMenuItem menuitem1 = new JMenuItem("New"); menu1.add(menuitem1); setJMenuBar(menubar); } public void paint(Graphics g){ } } いまウィンドウにメニューバーを表示させようとして上のプログラムで実行させたんですが、画像のようにメニューバーが表示されません。 そこでpaintの引数を消してみたところ表示されます。 しかし、paint内で画像の表示の処理もしたいので引数がないといけません。 どうしたらいいでしょうか? オンボードグラフィックスについて 最近のATXマザーボードについて調べていた所、どの製品にもオンボードグラフィックスがついていないことに気づきました。これはCPUにGPUが統合されたからでしょうか? 例えばLGA1150のマザーボードにi7-4770kを乗せた場合、マザーボードの映像端子にはこのCPUの内臓グラフィックスから出力され、モニタを接続すれば表示されるのでしょうか? GraphicsクラスとAPIの関係??? プリンタに線を描くのに (1)APIのLineTo関数 (2)GraphicsのDrawLineメソッド の何れかを使用しております これに関連して常々疑問に思っていることは、LineTo関数とDrawLineメソッドの関係です 描画初心者の駆出しである私としては『DrawLineメソッドは結局の所、APIのLineTo関数を呼出して線を描いている』と思っておりますが間違えでしょうか? 質問を更に簡潔に表現するならばGraphicsクラスは公開されているAPI描画関数を組合わせて使用することにより出来上がっているか? との質問です それともGraphicsクラスは一般のAPIを使用せず独自の機能で描画しているのでしょうか? ご存知したら教えてください、また関連資料等がありましたらお願い致します 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ありがとうございます。 Appletの場合そのクラスは具体的に例えばどのようなクラスでしょうか?