我自己写了一个类,有x,y坐标位置属性,还有image属性,在窗体创建它的一个实例,加载一张图片到它的image属性中,然后每次repaint时取出它的image进行drawImage()方法,这样就可以显示那张图片.
现在我想用鼠标拖动它,当然在mouseDragged方法里可以对那个实例的x,y属性进行控制,然后repaint时读取x,y的属性进行有位置的重绘就可以实现鼠标移动去控制图像的移动了,我现在想再创建多个实例,加载多张图片,然后鼠标对每一个图片进行拖动,这时候问题就出现了,因为我写的那个类没有实现或继承任何其它的类,就不能在窗体使用addMouseMotionListener()方法去注册监听器,然后对每一个实例进行控制,(比如说Label就可以,创建多个Label然后都注册addMouseMotionListener监听方法,在拖动某一个Label时就调用setLocation方法对位置进行控制).
想问一下各位我能用什么方法做到?
多谢
现在我想用鼠标拖动它,当然在mouseDragged方法里可以对那个实例的x,y属性进行控制,然后repaint时读取x,y的属性进行有位置的重绘就可以实现鼠标移动去控制图像的移动了,我现在想再创建多个实例,加载多张图片,然后鼠标对每一个图片进行拖动,这时候问题就出现了,因为我写的那个类没有实现或继承任何其它的类,就不能在窗体使用addMouseMotionListener()方法去注册监听器,然后对每一个实例进行控制,(比如说Label就可以,创建多个Label然后都注册addMouseMotionListener监听方法,在拖动某一个Label时就调用setLocation方法对位置进行控制).
想问一下各位我能用什么方法做到?
多谢
解决方案 »
- 【100分】static关于静态类的问题
- 新手问 String应用问题!
- jdbc 连接数据库 sql server2000问题 急求?
- Class的方法public Class[] getInterfaces()与public ClassLoader getClassLoader()这两个方法如何理解?
- 请问JAVA中怎么读取DAT文件中的内容啊
- 如何使用jdk自带的HtmlConverter?
- JavaAPI中有哪些地方用到了Facade模式?
- 热点!!!
- java登录出错
- 请教一个问题,关于main方法的问题
- 证明,派生类的构造器不能捕获它的基类构造器所抛出的异常。
- String类的intern()方法是什么?
1. 使用java.awt.event.ActionListener。
2.注册监听器以监听事件源产生的事件(通过ActionListener来响应用户点击按钮)。
3.定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
示例代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; public class Sample
{
private static JFrame frame; // 定义为静态变量以便main使用
private static JPanel myPanel; // 该面板用来放置按钮组件
private JButton button1; // 这里定义按钮组件
private JButton button2; // 以便让ActionListener使用
// 利用一般内部类来监听每一个事件源产生的事件如(button1, button2)
private class Button1Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"按钮1 被点击");
}
}
private class Button2Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"按钮2 被点击");
}
}
public Sample() // 构造器, 建立图形界面
{
// 新建面板
myPanel = new JPanel();
// 新建按钮
button1 = new JButton("按钮1"); // 新建按钮1
button2 = new JButton("按钮2"); // 对每一个组件注册监听内部类
button1.addActionListener(new Button1Handler());
button2.addActionListener(new Button2Handler()); myPanel.add(button1); // 添加按钮到面板
myPanel.add(button2);
} public static void main(String s[])
{
Sample gui = new Sample(); // 新建Simple3组件 frame = new JFrame("Simple Test");
// 处理关闭事件的通常方法
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{System.exit(0);} }); frame.getContentPane().add(myPanel);
frame.pack();
frame.setVisible(true);
}
}
那个我当然知道,还用Label标签实现了.
我要的是对Image增加监听!我自己写了个类,里面有属性Image,产生它的实例后取得它Image属性进行drawImage,那个类不继承Component的,怎么可以加addMouseMotionListener呢?
所以我到这里来问你们了,看有没有什么办法,不要问我为什么不用Label现成的类做那个,因为那样的话以后的步骤局限性很大.
不多还是多谢你关注.
package csdn;
import java.applet.Applet;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.net.URL;
public class ImageEntity {
private int x;
private int y;
private Image image;
private Applet applet;
public ImageEntity(Applet applet){
setImage(null);
this.applet = applet;
}
private URL getURL(String filename) {
URL url = null;
try {
url = this.getClass().getResource(filename);
}
catch (Exception e) { }
return url;
}
public void load(String filename) {
Toolkit tk = Toolkit.getDefaultToolkit();
image = tk.getImage(getURL(filename));
}
public Rectangle getBounds() {
Rectangle r;
r = new Rectangle((int)getX(), (int)getY(), image.getWidth(applet), image.getHeight(applet));
return r;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Applet getApplet() {
return applet;
}
public void setApplet(Applet applet) {
this.applet = applet;
}
}
RealPhoto源码:
package csdn;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
public class RealPhoto extends Applet implements MouseMotionListener, MouseListener {
BufferedImage backbuffer;
Graphics2D g2d;
AffineTransform identity = new AffineTransform();
ImageEntity[] photo = new ImageEntity[4];
boolean leftMouseButton;
int mouseX,mouseY;
public void init(){
backbuffer = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
g2d = backbuffer.createGraphics();
for(int i=0;i<4;i++){
photo[i] = new ImageEntity(this);
String imageName = i+".jpg";
photo[i].load(imageName);
}
this.addMouseMotionListener(this);
this.addMouseListener(this);
}
public void update(Graphics g){
g2d.setTransform(identity);
g2d.setPaint(Color.GRAY);
g2d.fillRect(0, 0, getSize().width, getSize().height);
drawLine();
drawPhoto();
paint(g);
}
public void drawLine(){
g2d.setTransform(identity);
g2d.setColor(Color.BLUE);
g2d.drawLine(0, 0, mouseX, mouseY);
}
public void drawPhoto(){
// photo.transform();
// photo.draw();
if(leftMouseButton){
//g2d.setTransform(identity);
for(int i=0;i<4;i++){
g2d.setTransform(identity);
g2d.translate(photo[i].getX(), photo[i].getY());
g2d.scale(0.3, 0.3);
g2d.drawImage(photo[i].getImage(), identity, this);
}
}
}
public void updatePhoto(){
for(int i=0;i<4;i++){
if(photo[i].getBounds().contains(mouseX,mouseY)){
photo[i].setX(mouseX-80);
photo[i].setY(mouseY-80);
}
}
}
public void paint(Graphics g){
g.drawImage(backbuffer, 0, 0, this);
}
public void start(){}
public void run() {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
int keyCode = e.getButton();
switch(keyCode){
case MouseEvent.BUTTON1:
leftMouseButton = true;
break;
}
}
public void mouseReleased(MouseEvent e) {
int keyCode = e.getButton();
switch(keyCode){
case MouseEvent.BUTTON1:
leftMouseButton = false;
break;
}
}
public void mouseDragged(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
updatePhoto();
repaint();
}
public void mouseMoved(MouseEvent e) {}
}
运行的话将四张图片按0.jpg,1.jpg,2.jpg,3.jpg放到csdn包下运行.
上面实现的是mouseDragged的时候,把鼠标位置传递给ImageEntity的x,y属性以实现移动,我现在想有什么方法可以给ImageEntity增加监听器,这样就可以像Label,Button等等组件一样addMouseMotionListener了,就无需做边界判断去拖动了.
这次该说清了吧...