tabにdrawImageで画像を描画したい

このQ&Aのポイント
  • 以下のソースでtabbedpaneに対して、drawImageメソッドで画像を描画したいです。
  • Zoomクラスを作成し、paintComponentメソッド内で画像を描画します。
  • JTabbedPane内にZoomオブジェクトを追加することで、画像を描画することができます。
回答を見る
  • ベストアンサー

tabにdrawImageで画像を描画したい

tabにdrawImageで画像を描画したい 以下のソースでtabbedpaneに対して、ImageIconを指定して画像をのせるではなく、 drawImageメソッドで描画したいです。 ご存知の方がおられましたら教えてください。 import javax.swing.*; import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Graphics2D; public class JTabbedPaneTest4 extends JFrame { Zoom zoom = null; public static void main(String[] args) { JTabbedPaneTest4 frame = new JTabbedPaneTest4(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setVisible(true); } JTabbedPaneTest4() { JTabbedPane tabbedpane = new JTabbedPane(); JPanel tabPanel1 = new JPanel(); tabPanel1.add(new JButton("button1")); ImageIcon icon1 = new ImageIcon("img1.jpg"); zoom = new Zoom(icon1, 0, 0, 50, 50); //tabbedpane.addTab("tab1", icon1, tabPanel1);//ok //tabbedpane.add(zoom, tabPanel1);//ng(パネルに書き込まれてしまう) getContentPane().add(tabbedpane, BorderLayout.CENTER); } class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); g2.drawImage(icon.getImage(), x, y, w, h, this); } } }

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

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  まず、指摘しておきたいのは、 tabbedpane.add(zoom, tabPanel1);  これ、逆ですね。 tabbedpane.add(tabPanel1, zoom);  やるとしても、こうです。  zoom が JTabbedPane の中に追加されてしまうのは、そのためですね。  ただ、このように修正したとしても、タブの部分に zoom が表示されるわけではありません。  それというのも、JTabbedPane の add(Component component, Object constraints) メソッドは、第2引数が、String の時はタブのタイトルに、Icon の時はタブのアイコンに、それ以外は無視するという仕様になっているからです。  タブにアイコンとして、表示させたい場合は、Icon インターフェースを実装したものでなくてはなりません。  そのまま ImageIcon を使いたくないということは、Zoom で拡大縮小を管理したいためだと想像します。  ならば、Zoom に Icon インターフェースを実装するとか、すればいいんじゃないかと思います。 class Zoom extends JComponent implements Icon {   private static final long serialVersionUID = 1L;   private ImageIcon icon = null;   private int x = 0;   private int y = 0;   private int h = 0;   private int w = 0;   private double scale = 1.0d;   public Zoom(ImageIcon icon, int x, int y, int w, int h) {     super();     this.icon = icon;     this.x = x;     this.y = y;     this.w = w;     this.h = h;   }   public void paintComponent(Graphics g) {     Graphics2D g2 = (Graphics2D) g;     AffineTransform at = g2.getTransform();     g2.scale(scale, scale);     g2.drawImage(icon.getImage(), x, y, w, h, this);     g2.setTransform(at);   }   public void paintIcon(Component c, Graphics g, int x, int y) {     Graphics2D g2 = (Graphics2D) g;     //ここら辺のことは、やった方がいいのか、やらなくていいのか、よくわかりません。     AffineTransform at = g2.getTransform();     g2.drawImage(icon.getImage(), x, y, w, h, c);     g2.setTransform(at);     //↑これも   }   public int getIconWidth() {     //scale を変更したときは、このままでは、まずいかも。     return w;   }   public int getIconHeight() {     //ここも     return h;   } }  ほかにも、方法はあるかと思いますが、とりあえず、こんな感じでどうでしょう。

hatokamome
質問者

お礼

いつもご回答ありがとうございます。 おかげさまで、インターフェースを考えるきっかけとなりました。 勉強になります。

関連するQ&A

  • JButtonの画像をactionPerformedメソッド内で再描画

    JButtonの画像をactionPerformedメソッド内で再描画したい。 以下のソースのようにして、再描画したいのです。 setIconメソッドではなく、 JButtonに対して描画したものに対して再描画したいです。 Graphics2DクラスについてJAVA APIで調べましたが、 仕組の理解に至りませんでした。 仕組みと方法を教えて頂きたいです。 よろしくお願いいたします。 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class test extends JFrame implements ActionListener{ JButton b= new JButton(); public static void main(String a[]) { new test(); } public test() { super(); this.setSize(100,100); b.addActionListener(this); b.add(new Zoom(new ImageIcon("img1.jpg"),0,0,50,50)); this.add(b); this.setVisible(true); } class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); ////////////////////////////////// //画僧を再描画したい。 //g2.clearRect(0, 0, 80, 80);//× g2.drawImage(icon.getImage(), x, y, w, h, this); } } public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ System.out.print("ok"); //this.repaint();//× //b.repaint();//× b.add(new Zoom(new ImageIcon("img2.jpg"),0,0,50,50));//(再描画できない) //b.setIcon(new ImageIcon("img2.jpg"));//ok(再描画出来る) } } }

    • ベストアンサー
    • Java
  • JButtonの座標(0,0)にアイコンをセット

    JButtonに以下のように、画像を書込む際、画像を一番は端(左上角)から乗せたいです。 つまり、ボタンの右上角(0,0)から乗せたいのです。 現状では、左端に隙間があいてしまいます。 この方法がご存知の方がおられましたら教えてください。 よろしくお願いいたします。 import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; public class Zoom extends JComponent { private static final long serialVersionUID = 1L; private ImageIcon icon = null; private int x = 0; private int y = 0; private int h = 0; private int w = 0; private double scale = 1.0d; public Zoom(ImageIcon icon, int x, int y, int w, int h) { super(); this.icon = icon; this.x = x; this.y = y; this.w = w; this.h = h; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.scale(scale, scale); g2.drawImage(icon.getImage(), x, y, w, h, this); } public static void main(String[] args) { ImageIcon icon = new ImageIcon("cherry.jpg"); Zoom zoom = new Zoom(icon,0,0,100,100); JButton b = new JButton(); JFrame f = new JFrame(); b.add(zoom); b.setPreferredSize(new Dimension(icon.getIconHeight(), icon.getIconWidth())); f.add(b); f.pack(); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • プログラムの実行順番を教えてください

    始めまして。 http://javagame.skr.jp/index.php?RPG%A4%F2%BA%EE%A4%ED%A4%A6のページで配布されているサンプルソースの順番がわからないので教えてください。 できれば、実行順番に番号を振ってもらえればありがたいです。 ○Rpg.class import java.awt.Container; import javax.swing.JFrame; /* * Created on 2005/10/09 * */ /** * @author mori * */ public class Rpg extends JFrame { public Rpg() { // タイトルを設定 setTitle("勇者登場"); // パネルを作成 MainPanel panel = new MainPanel(); Container contentPane = getContentPane(); contentPane.add(panel); // パネルサイズに合わせてフレームサイズを自動設定 pack(); } public static void main(String[] args) { Rpg frame = new Rpg(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } ○MainPanel.class import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JPanel; class MainPanel extends JPanel { // パネルサイズ private static final int WIDTH = 480; private static final int HEIGHT = 480; // 勇者のイメージ private Image heroImage; public MainPanel() { // パネルの推奨サイズを設定 setPreferredSize(new Dimension(WIDTH, HEIGHT)); // イメージをロード loadImage(); } public void paintComponent(Graphics g) { super.paintComponent(g); // 勇者のイメージを表示 g.drawImage(heroImage, 0, 0, this); } private void loadImage() { ImageIcon icon = new ImageIcon(getClass().getResource("image/hero.gif")); heroImage = icon.getImage(); } }

  • 音楽を流したい。

    現在画像や文字を表示させるとともに、BGMも同時に流れるようになるプログラムを作っていますが、BGMを流すための処理メソッド(?)が分からなくて困っています。 分かる方は教えていただけると有難いです。 BGMのファイル名は「bgm.mid」です。 <プログラムソース> import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.lang.String; import java.awt.Font; import javax.swing.*; class BGMTest extends JFrame{ public BGMTest() { add(new DrawPanel()); } public static void main(String args[]){ JFrame frame = new GameTitle(); frame.setSize(640, 480); frame.setTitle("BGMテスト"); frame.setLocationRelativeTo(null); frame.setBackground(Color.pink); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class DrawPanel extends JPanel{ String path = "start.jpg"; Image image; public DrawPanel() { ImageIcon icon = new ImageIcon(path); image = icon.getImage(); } public void paintComponent(Graphics args) { super.paintComponent(args); args.drawImage(image, 0, 0, this); args.setFont(new Font("TimesRoman",Font.ITALIC,100)); args.setColor(Color.red); args.drawString("BGMテスト", 120, 230); } }

  • Paneに画像を二つ貼り付ける

    学校の課題でブロック崩しを作っているのですが、まずはバーとボールを画面に表示させようと思い以下の通りに作ったのですが、バーかボールどちらかしか画面に出てきません。 import java.awt.*; import javax.swing.*; class BlockBreak extends JFrame{ Bar br; Ball ba; public static void main(String[] args){ BlockBreak bb = new BlockBreak(); bb.setSize(300,500); bb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bb.setVisible(true); } BlockBreak(){ Container c = this.getContentPane(); ba = new Ball(); br = new Bar(); c.add(ba); c.add(br); } } class Ball extends JComponent{ int x,y; int xf,yf; ImageIcon baim; Image baimg; Ball(){ x = 150; y = 390; baim = new ImageIcon("ball.png"); baimg = baim.getImage(); } public void paint(Graphics g){ g.drawImage(baimg,x,y,this); } } class Bar extends JComponent{ int x,xl; final int y = 400; ImageIcon brim; Image brimg; Bar(){ x = 100; xl = 100; brim = new ImageIcon("bar.png"); brimg = brim.getImage(); } public void paint(Graphics g){ g.drawImage(brimg,x,y,this); } } BlockBreakクラスの c.add(ba); c.add(br); という個所の順番を入れ替えると、バーかボールどちらが画面に表示されるかが切り替わり、後に書いた方が表示されるみたいです。というか、前に書いた方のオブジェクトのpaintメソッド自体が実行されてない気がします(System.out.printlnを埋め込んで確かめてみました)。 Javaは本格的に始めてまだ浅いもので、単純ミスでしたら申し訳ありません。困っているのでご回答願います。

    • ベストアンサー
    • Java
  • Jave Swing 画像表示わからない

    java swingでGUIをプログラミングしている者です。 JLabelにImageIconの画像を貼り付けるプログラムです。↓ //画像を表示するプログラム //インポート import javax.swing.*; import java.awt.*; import java.awt.event.*; class gazopro extends JFrame{ JLabel l1; JButton b1; JPanel p; public static void main(String args[]) { //ウィンドウを作成また設定 gazopro frame = new gazopro(); frame.setBounds(300,200,700,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } gazopro(){ //コンポーネントを作成 p = new JPanel(); add(p); b1 = new JButton("画像を表示"); p.add(b1); ImageIcon icon = new ImageIcon("image.jpg"); l1 = new JLabel(icon); p.add(l1); } }   わからないところは、ImageIcon icon = new ImageIcon("image.jpg");のところです。 ImageIconの引数は、プログラミングを行っているパソコン(OS は Windows)のマイコンピューター→ Cドライブ→ MyJava→ image.jpgを指定しましたがこれで合ってますか? このプログラムでは、画像が表示されませんでした。 どうすればいいでしょうか? 解説と、ご指導宜しくお願いします。

    • ベストアンサー
    • Java
  • setIcon() の反対のようなものを探しています。

    こんばんは。GUIで、一秒ごとに画像を切り替える、スライドショーのようなものを作ってみたのですが、画像が切り替わらず、画像の上に画像が配置され、どんどん積み重なっていく感じになりました。以下がそのコードです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class IconChange extends JFrame{ private Timer timer; private JLabel img; private int sec; private Icon[] icon=new ImageIcon[11]; private JPanel pane; public static void main(String[] args){ IconChange frame=new IconChange("画像チェンジ"); frame.pack(); frame.setDefaultCloseOperation(3); frame.setVisible(true); } public IconChange(String title){ super(title); sec = 0; pane=(JPanel)getContentPane(); pane.setPreferredSize(new Dimension(800,600)); pane.setOpaque(true); pane.setBackground(new Color(0x00000000, true)); img=new JLabel(new ImageIcon("images2/1.jpg")); pane.add(img); for(int i=0;i<=10;i++){ icon[i]=new ImageIcon("images2/"+i+".png"); } timer = new Timer(1000 , new Kirikae()); timer.start(); } class Kirikae implements ActionListener{ public void actionPerformed(ActionEvent e){ img.setIcon(icon[sec]); if(sec>=10){sec=0;} sec++; } } } JLabelに画像をセットしたら、前の画像と入れ替わり新しい画像がセットされるとおもったのですが、前の画像が残ったまま新しい画像がセットされます。新しい画像をセットする前に前の画像のセットを取り消したいのですが、いい方法がございましたらアドバイスお願いいたします。

    • ベストアンサー
    • Java
  • drawImageメソッドの使い方

    import com.sun.image.codec.jpeg.JPEGImageDecoder; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.awt.image.BufferedImage; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.*; public class EdgeDetection extends Object { public static void main(String[] args) { BufferedImage in_bi = null; BufferedImage out_bi = new BufferedImage(134, 181, 1); Graphics2D outg2 = out_bi.createGraphics(); Shape s = new Line2D.Float(10.0f, 50.0f, 90.0f, 150.0f); outg2.drawImage(s, 0, 0, 0); JPEGImageEncoder ie = null; try { ie = JPEGCodec.createJPEGEncoder(new FileOutputStream(args[0])); } catch(FileNotFoundException e) { System.err.println("ファイルが見つかりません [write]"); System.err.println("Edge_" + args[0]); System.exit(253); } try { ie.encode(out_bi); } catch(IOException e) { System.err.println("書き込みに失敗しました"); System.exit(252); } } } ------------------------------------------------------------- このようなソースを作成してコンパイルを行ったのですが、35行目の drawImageでエラーが発生します。見直したところ drawImageの引数に間違いがあるとも思えないのですが、 他に何かエラーになるような個所があるのでしょうか? 開発キットはJDK1.3です。宜しくお願いします。

    • ベストアンサー
    • Java
  • javaでgraphicsの描画の件

    今日は javaでgraphicsの描画を行っていますが、CENTERのペインには、描画できますが、 それ以外のペイン(NORTH,WEST、EAST,、SOUTH)には、描画できないように思います。 Q1)この件について、コメント頂けますと大変助かります。 下記に、ソースコードを添付いたします。 =================== package pkg; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import javax.swing.JFrame; import javax.swing.JPanel; public class SampleApp extends JFrame { public SampleApp(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(600, 300); this.add(new GPanel(), BorderLayout.WEST); this.add(new GPanel(), BorderLayout.CENTER); } public static void main(String[] args) { new SampleApp().setVisible(true); } } class GPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); // int w = this.getWidth(); // int h = this.getHeight(); int w=200; int h=200; g.setColor(Color.RED); g.fillOval(0, 0, w/2, h/2); Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(40, 40, w,h)); g.setColor(Color.BLUE); g.setFont(new Font("Serif", Font.BOLD, 36)); g.drawString("Graphics draw!", 10, h - 50); // g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(30.0d, 50.0d, 180.0d, 140.0d)); g2.setPaint(Color.PINK); BasicStroke wideStroke = new BasicStroke(8.0f); g2.setStroke(wideStroke); g2.draw(new Line2D.Double(30.0d, 120.0d, 250.0d, 70.0d)); } }

    • ベストアンサー
    • Java
  • ボタンクリック後パネルを再描画repaintしたい

    ボタンをクリック後にstaticで保持していた値にプラス1して その値をパネルに再描画したいと思っています。 下記のプログラムだとボタンをクリックすると (<1<2<3<4)となって画像と数字が増えてしまいます 行いたいのは数字の部分だけが再描画されて カウントされて<3と表示されるだけになってもらいたい クラス1つ目 import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sample extends JFrame{ static int value=1; JPanel work = new JPanel(); public static void main(String[] args) { Sample frame = new Sample(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 200, 200, 100); frame.add(frame.createPanel(), BorderLayout.LINE_END); frame.setVisible(true); } public JPanel createPanel() { ImageIcon icon = new ImageIcon("./img/left.gif"); JLabel label = new JLabel(); Cursor c = new Cursor(Cursor.HAND_CURSOR); label.setCursor(c); label.setIcon(icon); JLabel strLabel = new JLabel(); String str = Integer.toString(value); strLabel.setText(str); work.add(label); work.add(strLabel); label.addMouseListener(new myListener()); return work; } class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ System.out.print(Sample.value++); createPanel().repaint(); setVisible(true); } } } クラス2つ目 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} }

    • ベストアンサー
    • Java

専門家に質問してみよう