2017-03-28 14 views
0

私はJFrameを使ってイメージをインポートして表示し、マウスのクリックを検出するためにmousemotionlistenerを使用しました。イメージの上に描画したいと考えています。ユーザーがクリックして画像の残りの部分を保存しながらそのピクセルを特定の色にすることができるようにしたいと思いますが、画像の残りの部分を削除せずにGraphicsを使用する方法を見つけることができませんでしたまたは新しいウィンドウを開く。Javaでイメージの上に描画する方法は?

public class Simple extends JFrame{ 
    static ImageIcon icon; 
    static JFrame myframe; 
    static JLabel mylabel; 
    static BufferedImage image = null; 
    public static void main(String[] args) { 
    try{ 
     image = ImageIO.read(new File("mypic.png")); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    icon=new ImageIcon(image); 
    myframe=new JFrame(); 
    myframe.setSize(200,200); 
    myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mylabel=new JLabel(); 
    mylabel.setIcon(icon); 
    myframe.getContentPane().add(mylabel); 
    myframe.pack(); 
    Container container = myframe.getContentPane(); 
    MouseMotionEvents3 mousemotion = new MouseMotionEvents3(); 
    container.add(mousemotion); 
    myframe.setVisible(true); 
    while(1 == 1) { 
     if(mousemotion.signal == true) { 
     System.out.println("second message"); 
     mousemotion.signal = false;  
     } 
    } 
    } 
} 
    class MouseMotionEvents3 extends JPanel implements MouseListener, 
    MouseMotionListener { 
    public boolean signal; 
    public MouseMotionEvents3() { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     signal = false; 
    } 
    public void mouseClicked(MouseEvent me) { 
    // System.out.println("i hate you"); 
    } 

    public void mouseEntered(MouseEvent me) { 
    } 

    public void mouseExited(MouseEvent me) { 
    } 

    public void mousePressed(MouseEvent me) { 
     signal = true; 
     System.out.println("message"); 
    } 

    public void mouseReleased(MouseEvent me) { 
    } 

    public void mouseDragged(MouseEvent me) { 
    } 

    public void mouseMoved(MouseEvent me) { 
    } 
    } 
+3

を利用します。//docs.oracl e/javase/tutorial/uiswing/painting /)と[2D graphics trail](https://docs.oracle.com/javase/tutorial/2d/) – MadProgrammer

+0

@MadProgrammer OPは、それは彼らがそのリンクに従わなかったこと、またはその内容を理解していることを明確に示しています。 :(OP:私は画像に直接描画します。それは永続的で、コードは変更を表示するために画像を表示するコンポーネント( 'mylabel')を' repaint() 'する必要があります –

+1

@AndrewThompson私は、 P – MadProgrammer

答えて

-2

最も簡単な方法は、色を付けるピクセルを表すポイントのリストを持つことです。次に、ラベルのpaintメソッドをオーバーライドして、最初にsuper.paint(イメージを表示する)を呼び出し、クリックされたピクセルをペイントします。あなたのマウス操作で

List<Point> points = new ArrayList<>(); 

myLabel = new JLabel() { 
    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     points.forEach(p -> g.fillRect(p.x, p.y, 1, 1)); 
    } 
}; 

リストだけに、現在のポイントを追加し、ラベルを再描画します。

public void mouseClicked(MouseEvent me) { 
    points.add(me.getPoint()); 
    myLabel.repaint(); 
} 

バッファリングされたイメージを含むより洗練された方法がありますが、これは開始するのに十分な可能性があります。

-2

私はそれを理解しました。私はJFrameのgetGraphics()メソッドを使用して、自分自身が画像の上に描画できるようにします。

編集:Andrew Thompsonが正しく、ウィンドウを最小化して変更を削除します。

+2

これはいくつかの理由で間違った解決策です:1)トップレベルのコンテナで直接ペイントするのではなく、代わりに 'JPanel'とカスタムペイントを追加するのが最善ですそれ。 2)**任意のコンポーネントで 'getGraphics()'を使用しないでください!**コンポーネントは、いつでも再描画するために呼び出すことができます(ウィンドウのサイズ変更、最小化、復元など)。 –

3

最初にPerforming Custom Painting2D Graphics Trailを読んでから始めることをお勧めします。彼らは出発点を提供します。

あなたがこれを達成かもしれないいくつかの方法がありますが、この例では、単にクリックポイントを追跡し、画像

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private List<Point> points; 
     private BufferedImage image; 

     public TestPane() { 
      points = new ArrayList<>(25); 
      try { 
       image = ImageIO.read(new File("/Users/shanewhitehead/Desktop/Screen Shot 2017-03-09 at 1.55.18 pm.png")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        points.add(e.getPoint()); 
        repaint(); 
       }     
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return image == null ? new Dimension(200, 200) : new Dimension(image.getWidth(), image.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      if (image != null) { 
       g2d.drawImage(image, 0, 0, this); 
      } 
      g2d.setColor(Color.RED); 
      for (Point p : points) { 
       g2d.fillOval(p.x - 4, p.y - 4, 8, 8); 
      } 
      g2d.dispose(); 
     } 

    } 

} 

の上にドットを描画します。この例では、画像自体に直接ドットを描きますどちらの場合も...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage image; 

     public TestPane() { 
      try { 
       image = ImageIO.read(new File("/Users/shanewhitehead/Desktop/Screen Shot 2017-03-09 at 1.55.18 pm.png")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        if (image != null) { 
         Point p = e.getPoint(); 
         Graphics2D g2d = image.createGraphics(); 
         g2d.setColor(Color.RED); 
         g2d.fillOval(p.x - 4, p.y - 4, 8, 8); 
         g2d.dispose(); 
         repaint(); 
        } 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return image == null ? new Dimension(200, 200) : new Dimension(image.getWidth(), image.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.drawImage(image, 0, 0, this); 
      g2d.dispose(); 
     } 

    } 

} 

、彼らは単におそらく、あなたは[実行カスタムペイント](httpsで始める必要がありGraphics2D API

関連する問題