画像を重ね表示するアプレット

このQ&Aのポイント
  • Java初心者が、画像を重ね表示するアプレットの作成について質問しています。
  • アプレットにはボタンを配置し、ボタンを押すたびに画像が階段状に重なるように表示されます。
  • 質問者はcardDisp()メソッドに問題があると考えており、具体的な修正方法を知りたいと述べています。
回答を見る
  • ベストアンサー

画像を重ね表示するアプレット

現在プログラミングを学んでいる、Java初心者です。 最初に何もない状態から、 ボタンを押すと画像が表示され、 ボタンを押すたびに画像が階段状に重なり、 何度か押すと、最初の場所に別の画像が 表示されるアプレットを作りたいです。 そこで簡単なソースを書いてみました。 /* *<Applet code=cardTest width=300 height=650> *</Applet> */ import java.awt.*; import java.awt.event.*; import java.awt.Graphics; import java.awt.Image; import javax.swing.*; import javax.swing.border.*; public class cardTest extends JApplet implements ActionListener{   JPanel pan1,pan2;   JButton hbtn=new JButton("hit");   int y =1;   int cardPoint=0;   Image dk,bust;   Graphics g;   public void init(){ Container con=getContentPane(); pan1=new JPanel(); pan2=new JPanel(); con.add(pan1); con.add(pan2,"South"); pan1.setLayout(null); pan1.setBackground(Color.green); pan1.setSize(250,600); pan2.setSize(250,100); pan2.add(hbtn); hbtn.addActionListener(this); dk=getImage(getCodeBase(),"dk.GIF"); bust=getImage(getCodeBase(),"bust.gif");   }   public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals("hit")){       System.out.println("hit!"); cardDisp(); }   }   public void cardDisp(){ System.out.println("carddisp!"); if(cardPoint>21){ System.out.println("bust!"); g.drawImage(bust,0,0,this); }else{ System.out.println("card!"); g.drawImage(dk,0,0+y*10,this); cardPoint+=10; y++; }   } } 確認用に、いくつかコメントが表示されるようにしています。 重ね表示するのでラベルは使えないと思い、 参考書が見つからず困っています。 cardDisp()が間違っていると思うのですが、 具体的にどう直せばよいのかわかりません。 よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

あなたはまず、Javaのグラフィクスプログラミングの基本を勉強する必要があります。ベストの場所はhttp://java.sun.com/docs/books/tutorial/uiswing/ですが、まず玄関だけを簡単に見るためには「ひとつ上をゆくJavaの教科書」(技術評論社)の第10章がおすすめです。 関連して、今あなたが使っている参考書は、ものすごく古いですから、それは使わないでください。(“古い”の詳細はここでは略します。) なお、画像がほんとうに重なって表示されるためには、pngのような、アルファ成分(透明成分)のある画像ファイルを使う必要があります。以下の例示プログラムは、そこまでの配慮はしていません。 ---------------------------------------------------- /* *<Applet code="Locoko" width="300" height="650"> *</Applet> */ import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import javax.swing.border.*; public class Locoko extends JApplet implements ActionListener{ static final int thres = 20; static final int lap = 15; JPanel pan1, pan2; JButton hbtn = new JButton("hit"); int y = 0; int lapc; Image dk, bust; BufferedImage img; Graphics2D ig; public void init(){ Container con = getContentPane(); pan1 = new JPanel(){ { setPreferredSize(new Dimension(250, 600)); setBackground(Color.green); } public void paintComponent(Graphics g){ super.paintComponent(g); lapc = y - 1; if (img == null){ img = new BufferedImage(pan1.getWidth(), pan1.getHeight(), //use TYPE_INT_ARGB for transparent image BufferedImage.TYPE_INT_RGB); ig = img.createGraphics(); ig.setColor(Color.green); ig.fillRect(0, 0, pan1.getWidth(), pan1.getHeight()); } if (y > 0 && y <= thres){ ig.drawImage(dk, 0, 0 + y * lapc, pan1); } else if (y > thres){ ig.drawImage(bust, 0, 0, pan1); } g.drawImage(img, 0, 0, this); } }; pan2 = new JPanel(); pan2.setBackground(Color.pink); con.add(pan1, BorderLayout.CENTER); con.add(pan2, BorderLayout.SOUTH); pan2.setPreferredSize(new Dimension(250, 100)); pan2.add(hbtn); hbtn.addActionListener(this); dk = getImage(getCodeBase(), "dk.gif"); bust = getImage(getCodeBase(),"bust.gif"); } public void actionPerformed(ActionEvent e){ if(e.getSource() == hbtn){ cardDisp(); } } public void cardDisp(){ ++y; pan1.repaint(); if (y > thres){ hbtn.setEnabled(false); } } } --------------------------------------------------

locoko
質問者

お礼

これです! ありがとうございます。 本が古いこともありますが、自分のレベル不足を感じました。。 勉強します。

関連するQ&A

  • アプレットについて

    リストの「明治」をクリックするとactionPerformedが呼ばれますが、コンストラクタで代入したListへの参照変数lが「null」と表示されてしまいif文で比較することができません。 MyListenerのコンストラクタではちゃんと参照する値が入っているのに、なぜactionPerformedが呼ばれたときに「null」になるかが分からない次第であります。 回答のほどよろしくお願い致します。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; class MyListener implements ActionListener{ private List l;   public MyListener(){} public MyListener(List l){ System.out.println(l); System.out.println("MyListener"); this.l = l; System.out.println(this.l); } public void actionPerformed(ActionEvent evt){ System.out.println("actionPerformed"); System.out.println(this.l); if(l == evt.getSource()){} //比較ができない } } public class MyApplet2 extends Applet{ private Panel sePanel, buttonPanel, waPanel, controlPanel; private List l; public void init(){ buttonPanel = new Panel(); waPanel = new Panel(); //レイアウトの設定 setLayout(new BorderLayout()); l = new List(1); l.add("明治"); waPanel.add(l); add(waPanel, "South");     //イベントリスナを登録する l.addActionListener(new MyListener()); new MyListener(l); } }

    • ベストアンサー
    • Java
  • ★滑らかな画像切り替え★

    アプレットを用いてスライドショーのようなものを作成しようと考えています。 しかしながら、画像を読み込むまでに時間がかかり、滑らかにつなぎたいのに、コマ送りのようになってしまいます。 できる限り断続的ではなく連続に見えるようにしたいと考えているのですが、良い方法はないでしょうか? 画像に関してはJavaScriptの方が有効だとするサイトが多すぎて悩んでいます。 プログラムを載せておきます。尚、画像はどれも800×600のサイズです。 import java.awt.*; import java.applet.*; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class S1 extends Applet implements MouseListener {   Image img;   int Flag=0;   public void init()   {     addMouseListener(this);     setSize(800,600);   }   public void paint(Graphics g){     switch(Flag){     case 0:img=getImage(getCodeBase(),"../image/bg001.jpg"); break;     case 1:img=getImage(getCodeBase(),"../image/bg002.jpg"); break;     default:img=getImage(getCodeBase(),"../image/bg003.jpg"); break;     }     g.drawImage(img,0,0,this);   }   public void mouseClicked(MouseEvent e) {     Flag++;     repaint();   }   public void mouseEntered(MouseEvent e) {}   public void mouseExited(MouseEvent e) {}   public void mousePressed(MouseEvent e) {}   public void mouseReleased(MouseEvent e) {} } 改善点などもあれば是非!

    • ベストアンサー
    • Java
  • 画像表示アプレットプログラムについて

    Javaのプログラムを勉強中です。 javaを理解するために下記のプログラム(zukei.java)を作成しました。 このプログラムを実行(appletviewer zukei.java)すると エラーにはなりませんが、(3)の行により画像("b.jpg")がすぐには表示されません。表示されたWindowにほかのWindowをいったんのせてから動かすと(3)行により画像"b.jpg"が表示されます。 (1)(2)の行は最初からうまく動作して表示されます。 もちろん(3)のappletをthisにするとうまく動作します。 理由がわかりません。 どなたかご教授ください。 プログラム zukei.class *<APPLET CODE="zukei.class" WIDTH=500 HEIGHT=500></APPLET> */ import java.applet.*; import java.awt.Graphics; import java.awt.*; public class zukei extends Applet { Applet applet; Image myimage; int iKai; public zukei(){ applet = this.applet; } public zukei(Applet applet) { this.applet = applet; } public void init(){ iKai = 0; myimage = getImage(getDocumentBase(),"b.jpg"); } public void paint(Graphics g) { kaku(); //(1) g.drawArc(100,150,50,50,0,360); //(2) g.drawImage(myimage,10,300,180,180,applet); //(3) } public void kaku(){ System.out.println("ABC" + iKai++); } }

  • javaの画像の表示のプログラムとmouselistenerのプログラ

    javaの画像の表示のプログラムとmouselistenerのプログラム(それぞれ↓にあります)をひとつに合わせたいのですがどうすればいいでしょうか? import java.awt.event.*; import javax.swing.*; class MyPanel extends JPanel implements MouseListener{ public MyPanel() { addMouseListener(this); } public void mouseClicked(MouseEvent e) { int x=e.getX(); int y=e.getY(); System.out.println("マウスがクリックされました (" + e.getX() + ", " + e.getY() + ")"); if((x<100&&x>40)&&(y<100&&y>40)){ System.out.println("範囲内"); }else{ System.out.println("aaa"); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } public class MouseEventExample extends JFrame { public static void main(String[] args) { new MouseEventExample(); } MouseEventExample() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().add(new MyPanel()); setSize(300, 200); setVisible(true); } } ======↑のプログラムと↓のプログラムを合わせたいのです package novel; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Java2dTest extends JFrame{ public static void main(String[] args){ Java2dTest test = new Java2dTest(); test.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); test.setBounds( 0, 0, 200, 200); test.setVisible(true); } public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; BufferedImage readImage = null; try { readImage = ImageIO.read(new File("sample.png")); } catch (Exception e) { e.printStackTrace(); readImage = null; } if (readImage != null){ g2.drawImage(readImage, 0, 0, this); } } }

  • TABキーの検出

    Swingコンポーネントで、TABキーのイベントを取得する 方法を教えてください。 タブキー以外は検出できるのですが… import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class TabKeyListener { public TabKeyListener() { JPanel panel = new JPanel(); panel.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } ); JFrame frame = new JFrame(); frame.add(panel); frame.setBounds(100,100,200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); panel.requestFocusInWindow(); } public static void main(String[] args) { new TabKeyListener(); } }

    • ベストアンサー
    • Java
  • java repaint()に関して

    プログラムで以下のpaintComponents内のデバックができません。 理由は一体何なのでしょうか? お願いします。 import java.awt.Graphics; import javax.swing.JPanel; public class MainPanel extends JPanel implements Runnable { Thread th; public MainPanel() { super(); } public void movestart() { th = new Thread(this); th.start(); } public void paintComponent(Graphics g) { System.out.println("このデバックができない"); super.paintComponent(g); } public void run() { while (true) { System.out.println("ここのデバックはできている"); repaint(); try { th.sleep(100); } catch (Exception e) { } } } }

    • ベストアンサー
    • Java
  • javaのmainの中のループに割込を掛ける

    毎度、お世話になります。 javaのmainの中のループに割込を掛ける方法をお教えください。 添付コードの『Thread.currentThread().interrup()』は、旨く機能しません。 以上、宜しくお願いします。 =========== import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class T_try_loop extends JFrame{ JFrame frame=new JFrame(); T_try_loop(){ System.out.println("aaaa"); JPanel p1=new JPanel(); JButton button1=new JButton("button1"); button1.addActionListener(new TimButton1()); p1.add(button1); getContentPane().add(p1, BorderLayout.CENTER); } public static void main(String args[]){ T_try_loop frame=new T_try_loop(); frame.setTitle("TTTT"); frame.setBounds(10,10,400,300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); for(int j = 0;j < 80; j++){ try{ Thread.sleep(80); System.out.print("*"); } catch(InterruptedException e){ System.out.println(": main_loopに、今割り込まれました"); } } }//public static void main public class TimButton1 implements ActionListener{ @Override public void actionPerformed(ActionEvent ae){ String cmd =ae.getActionCommand(); if(cmd.equals("button1")){ Thread.currentThread().interrupt(); System.out.println("Button clicked"); } } }//public class TimButton1 }

    • ベストアンサー
    • Java
  • アプレットで簡単な絵を描きたい

    drawLineメソッドを使用してマウスで絵を描きたいのですがうまくいきません。どうすればいいでしょうか? 一応私が途中まで考えたソースを下に載せておきます。 できればこのソースを変更して完成できればよく理解できるのでよろしくお願い致します。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics2 extends Applet implements MouseListener{ private int startX; private int startY; private int startX2; private int startY2; private boolean flg; public void init(){ addMouseListener(this); } public void mouseClicked(MouseEvent e){ } public void mousePressed(MouseEvent e){ flg = true; startX = e.getX(); startY = e.getY(); } public void mouseReleased(MouseEvent e){ flg = false; } public void mouseMoved(MouseEvent e){ System.out.println(flg); if(flg == true){ System.out.println(flg); startX2 = e.getX(); startY2 = e.getY(); repaint(); startX = e.getX(); startY = e.getY(); } } public void mouseEntered(MouseEvent e){} public void update(Graphics e){ e.drawLine(startX, startY,startX2, startY2); } public void mouseExited(MouseEvent e){} }

    • ベストアンサー
    • Java
  • ★Appletで画像読み込み&画像表示★

    import java.awt.*; import java.applet.*; public class S1 extends Applet { Image img; public void init() { img=getImage(getCodeBase(),"sample.jpeg"); } public void paint(Graphics g){ g.drawImage(img,50,50,this); } } 以上プログラムでアプレット上に拡張子がjpeg形式のsampleという100*100の画像を表示しようとしています。 クラス名はS1で問題なくエラーもありません。 java関連のサイトでも同じようにして画像が表示できるとされていたのですが、私のパソコンではアプレット上には何も表示されないまま、アプレットのみが起動するという状態になりました。 Eclipse SDKというものを使用していますが、それが原因なのかどうかもわからず困っています。 お手数をお掛けしますが、回答の程よろしくお願いします。

    • ベストアンサー
    • Java
  • アプレットでマウスイベントが出ない

    クリックしても反応しません。 また、マウスイベントが発生したときに飛ぶメソッドにSystem.out.printlnを入れるとException in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pDataが出ることがあります。 import java.applet.Applet; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class NewJApplet extends javax.swing.JApplet implements MouseListener{ int x = 10; int y = 10; public void init() { x = 50; y = 50; } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed( MouseEvent e ){ x = e.getX(); // マウスがクリックされた位置のx座標を取得する y = e.getY(); // マウスがクリックされた位置のy座標を取得する repaint(); // アプレットの再描画を指示する } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.fillOval(x,y,10,10); } } 使ってるのは jre1.6.0_01 NetBeans 5.5です

    • ベストアンサー
    • Java