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

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

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

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

Q&A

解決済

3回答

1930閲覧

JAVA画像の再描画

destiny_

総合スコア4

Java

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

1グッド

0クリップ

投稿2021/01/04 04:34

プログラミング初心者です。JAVAを使いGUI上で画像をドラッグして移動させたいと思うのですが、現在考え付いたのはMouseMotionListennerのmouseDraggedメソッドでカーソルの位置を取得し画像の配置に反映させてrepaintでpaintメソッドを呼び出し再描画させる方法です。この方法だとカーソルを動かすたびに全体を再描画してしまうため動かしていない画像がチカチカしてしまいます。
何かいい方法はないでしょうか?

import javax.swing.*; import java.awt.event.*; import java.awt.*; public class mouse extends JFrame implements MouseMotionListener,MouseListener { ImageIcon icon; Image i; Graphics a,b; int x1=100; int y1=100; int x2=100; int y2=300; int clickx,clicky; int comand; //位置の微調整 int distancex=10; int distancey=44; public static void main(String[] args) { new mouse(); } public mouse() { setSize(500, 500); setLayout(null); setVisible(true); addMouseMotionListener(this); addMouseListener(this); icon = new ImageIcon("./image/imsge1.png"); i = icon.getImage(); } public void paint(Graphics g) { super.paint(g); a = getContentPane().getGraphics(); a.drawImage(i,x1,y1,50,50,this); b = getContentPane().getGraphics(); b.drawImage(i,x2,y2,50,50,this); } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void mouseClicked(MouseEvent e){ //移動させる画像の選択 clickx=e.getPoint().x; clicky=e.getPoint().y; if(clickx<x1+50+distancex&&clickx>x1+distancex&&clicky>y1+distancey&&clicky<y1+50+distancey){ comand=1; } if(clickx<x2+50+distancex&&clickx>x2+distancex&&clicky>y2+distancey&&clicky<y2+50+distancey){ comand=2; } } public void mouseDragged(MouseEvent e) { switch(comand){ case 1: x1=e.getPoint().x-distancex-50/2; y1=e.getPoint().y-distancey-50/2; repaint(); break; case 2: x2=e.getPoint().x-distancex-50/2; y2=e.getPoint().y-distancey-50/2; repaint(); break; } } public void mouseMoved(MouseEvent e) { } }
TN8001👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

JPanelベースにすればダブルバッファリングで描画するので、ちらつかないようになります。

Java

1import java.awt.Graphics; 2import java.awt.Image; 3import java.awt.event.MouseAdapter; 4import java.awt.event.MouseEvent; 5import javax.swing.ImageIcon; 6import javax.swing.JFrame; 7import javax.swing.JPanel; 8 9 10public class Mouse extends JPanel { // JPanelベースに 11 public static void main(String[] args) { 12 var frame = new JFrame(); 13 frame.setSize(500, 500); 14 frame.setLocationRelativeTo(null); 15 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 frame.add(new Mouse()); 17 frame.setVisible(true); 18 } 19 20 private Image image = new ImageIcon("./image/imsge1.png").getImage(); 21 private int x1 = 100; 22 private int y1 = 100; 23 private int x2 = 100; 24 private int y2 = 300; 25 private int offsetX; // 画像のつまんだ位置X 26 private int offsetY; // 同上Y 27 private int command; 28 29 public Mouse() { 30 addMouseListener(new MouseAdapter() { // 不要なメソッドが邪魔なのでアダプタで 31 @Override public void mousePressed(MouseEvent e) { // ClickedからPressedに変更 32 var clickX = e.getPoint().x; 33 var clickY = e.getPoint().y; 34 35 if (x1 < clickX && clickX < x1 + 50 && y1 < clickY && clickY < y1 + 50) { 36 command = 1; 37 offsetX = clickX - x1; // 画像のつまんだ位置を保存 38 offsetY = clickY - y1; 39 } 40 if (x2 < clickX && clickX < x2 + 50 && y2 < clickY && clickY < y2 + 50) { 41 command = 2; 42 offsetX = clickX - x2; 43 offsetY = clickY - y2; 44 } 45 } 46 47 @Override public void mouseReleased(MouseEvent e) { 48 command = 0; 49 } 50 }); 51 52 addMouseMotionListener(new MouseAdapter() { 53 @Override public void mouseDragged(MouseEvent e) { 54 switch (command) { 55 case 1: 56 x1 = e.getPoint().x - offsetX; // 画像のつまんだ位置を考慮し更新 57 y1 = e.getPoint().y - offsetY; 58 repaint(); 59 break; 60 case 2: 61 x2 = e.getPoint().x - offsetX; 62 y2 = e.getPoint().y - offsetY; 63 repaint(); 64 break; 65 } 66 } 67 }); 68 } 69 70 @Override 71 protected void paintComponent(Graphics g) { // paintからpaintComponentに 72 super.paintComponent(g); 73 74 g.drawImage(image, x1, y1, 50, 50, this); 75 g.drawImage(image, x2, y2, 50, 50, this); 76 } 77}

気になった点をいくつか修正させていただきました。


画像をJLabelで表示すれば、当たり判定や描画等をSwingに任せられてかなり手を抜けます。

Java

1import java.awt.Point; 2import java.awt.event.MouseAdapter; 3import java.awt.event.MouseEvent; 4import javax.swing.ImageIcon; 5import javax.swing.JComponent; 6import javax.swing.JFrame; 7import javax.swing.JLabel; 8import javax.swing.JPanel; 9 10 11public class Mouse extends JPanel { 12 public static void main(String[] args) { 13 var frame = new JFrame(); 14 frame.setSize(500, 500); 15 frame.setLocationRelativeTo(null); 16 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 frame.add(new Mouse()); 18 frame.setVisible(true); 19 } 20 21 public Mouse() { 22 setLayout(null); 23 24 var imageIcon = new ImageIcon("./image/imsge1.png"); 25 var adapter = new MouseAdapter() { 26 private Point offset; 27 28 @Override public void mousePressed(MouseEvent e) { 29 offset = e.getPoint(); 30 } 31 32 @Override public void mouseDragged(MouseEvent e) { 33 var component = (JComponent) e.getSource(); 34 var x = component.getX() + e.getX() - offset.x; 35 var y = component.getY() + e.getY() - offset.y; 36 component.setLocation(x, y); 37 } 38 }; 39 40 var label1 = new JLabel(imageIcon); 41 label1.setBounds(100, 100, 50, 50); 42 label1.addMouseListener(adapter); 43 label1.addMouseMotionListener(adapter); 44 add(label1); 45 46 var label2 = new JLabel(imageIcon); 47 label2.setBounds(100, 300, 50, 50); 48 label2.addMouseListener(adapter); 49 label2.addMouseMotionListener(adapter); 50 add(label2); 51 } 52}

投稿2021/01/04 08:43

編集2021/01/04 08:48
TN8001

総合スコア9862

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

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

destiny_

2021/01/04 16:27

コード修正と的確なコメントありがとうございます。
guest

0

再描画のタイミングを「ドラッグ中」→「マウス離す」に変更してはいかがでしょうか。

投稿2021/01/04 05:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

動かしていないときは画像の更新を止めるようにすればいいというはなしなんでは

投稿2021/01/04 05:19

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問