在java做的画图板中,如何选中一个已经画好的图形,把它放大、缩小、移动??? 在java做的画图板中,如何选中一个已经画好的图形,把它放大、缩小、移动???类似windows的画图板功能,急呀,大牛们帮帮忙 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 package aa;import javax.swing.*;import javax.swing.filechooser.*;import java.awt.*;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.io.File;/** * 在窗体上拖拽图片。使用方法:双击窗体空白处将会弹出打开图片对话框。打开图片后可以在窗体上拖拽图片。 */public class DragingFrame extends JFrame { /** * 构造函数 * * @throws HeadlessException ??? */ public DragingFrame() throws HeadlessException { this.setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); getContentPane().add(new ImagePanel(), BorderLayout.CENTER); } // 程序入口 public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); DragingFrame frame = new DragingFrame(); frame.setSize(400, 300); frame.setLocation(300, 300); frame.setResizable(false); frame.setTitle("双击打开图片,然后拖拽"); frame.setVisible(true); }}/** * 能够拖拽图片的面板 */class ImagePanel extends JPanel { private DragStatus status = DragStatus.Ready; // 拖拽状态 private Image image; // 要显示的图片 private Point imagePosition = new Point(0, 0), // 图片的当前位置 imageStartposition = new Point(0, 0), // 每次拖拽开始时图片的位置(也就是上次拖拽后的位置) mouseStartposition; // 每次拖拽开始时鼠标的位置 ImagePanel() { addMouseListener(new MouseListener() { // 双击鼠标时打开图片 public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { openImage(); } } // 按下鼠标时,更改状态,并且记录拖拽起始位置。 public void mousePressed(MouseEvent e) { if (status == DragStatus.Ready) { status = DragStatus.Dragging; mouseStartposition = e.getPoint(); imageStartposition.setLocation(imagePosition.getLocation()); } } // 松开鼠标时更改状态 public void mouseReleased(MouseEvent e) { if (status == DragStatus.Dragging) { status = DragStatus.Ready; } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }); addMouseMotionListener(new MouseMotionListener() { // Java 有拖拽事件,在这个事件中移动图片位置 public void mouseDragged(MouseEvent e) { if (status == DragStatus.Dragging) { moveImage(e.getPoint()); } } public void mouseMoved(MouseEvent e) { } }); } /** * 移动图片。实际上画图工作在 paintComponent() 中进行,这里只是计算图片位置,然后调用该方法。 * * @param point 当前的鼠标位置 */ private void moveImage(Point point) { // 图片的当前位置等于图片的起始位置加上鼠标位置的偏移量。 imagePosition.setLocation(imageStartposition.getX() + (point.getX() - mouseStartposition.getX()), imageStartposition.getY() + (point.getY() - mouseStartposition.getY())); repaint(); } // 打开图片 private void openImage() { System.out.println("Opening image..."); File file = createFileChooser().getSelectedFile(); if (file != null) { image = Toolkit.getDefaultToolkit() .getImage(file.getAbsolutePath()); if (image != null) { this.repaint(); } } } // 创建打开文件对话框 private JFileChooser createFileChooser() { JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("请选择图片文件..."); chooser.addChoosableFileFilter(new FileNameExtensionFilter("常用图片格式", "jpg", "jpeg", "gif", "png")); chooser.showOpenDialog(this); return chooser; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (image != null) { g.drawImage(image, (int) imagePosition.getX(), (int) imagePosition .getY(), this); } } private enum DragStatus { Ready, Dragging }} package aa;import java.io.File;import javax.swing.filechooser.FileFilter;public class FileNameExtensionFilter extends FileFilter { String string; String string2; String string3; String string4; String string5; public FileNameExtensionFilter(String string, String string2, String string3, String string4, String string5) { this.string = string; this.string2 = string2; this.string3 = string3; this.string4 = string4; this.string5 = string5; } public FileFilter FileNameExtensionFilter(String s1, String s2, String s3, String s4, String s5) { return new FileNameExtensionFilter(s1, s2, s3, s4, s5); } @Override public boolean accept(File f) { // TODO Auto-generated method stub return false; } @Override public String getDescription() { // TODO Auto-generated method stub return null; }} 我对楼主的建议就是,实时获取panel的大小,设定比例参数,再调用repaint()方法 不知道这是否能对楼主有所启发 如果你使用了graphics或者graphics2d那么,我建议你使用仿射变换。AffineTransform使用这个操作非常方便,而且这个类就是用来处理图像的旋转,平移,放大,缩小。用不着手动去算改编后的尺寸,位置等。需要逻辑清晰一些。话说回来,用什么不需要逻辑清晰呢? 设置 事件侦听器,比如onmouseup ondrag 之类的取出变化的坐标值然后repaint() 能否请高手发个相关的能实现选中图形,并能移动放缩的Java画图板程序。我也是新手,想知道这个怎么解决。 请问我这个关于继承的代码为什么在MyEclipse中运行时并没有错误提示,但就是无法显示结果呢? start() 和 system.out 的优先级别 java虚拟机 [疑问]改程序递归成死循环,但是计算机不会一直执行,而出了StackOverflowError,产生了这个条件是什么呢? 想达到这样初始化Date(2006,7,24)的效果,有什么简便的方法吗? 一个简单的问题,请人指点!! java时间真麻烦! 有关applet的问题 关于线程的一个小问题 JBuilder高手看过来 这段程序的执行顺序是怎样的? 什么是内容耦合?
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;/**
* 在窗体上拖拽图片。使用方法:双击窗体空白处将会弹出打开图片对话框。打开图片后可以在窗体上拖拽图片。
*/
public class DragingFrame extends JFrame { /**
* 构造函数
*
* @throws HeadlessException ???
*/
public DragingFrame() throws HeadlessException {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(new ImagePanel(), BorderLayout.CENTER);
} // 程序入口
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
DragingFrame frame = new DragingFrame();
frame.setSize(400, 300);
frame.setLocation(300, 300);
frame.setResizable(false);
frame.setTitle("双击打开图片,然后拖拽");
frame.setVisible(true);
}
}/**
* 能够拖拽图片的面板
*/
class ImagePanel extends JPanel { private DragStatus status = DragStatus.Ready; // 拖拽状态 private Image image; // 要显示的图片 private Point imagePosition = new Point(0, 0), // 图片的当前位置 imageStartposition = new Point(0, 0), // 每次拖拽开始时图片的位置(也就是上次拖拽后的位置) mouseStartposition; // 每次拖拽开始时鼠标的位置 ImagePanel() {
addMouseListener(new MouseListener() { // 双击鼠标时打开图片
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
openImage();
}
} // 按下鼠标时,更改状态,并且记录拖拽起始位置。
public void mousePressed(MouseEvent e) {
if (status == DragStatus.Ready) {
status = DragStatus.Dragging;
mouseStartposition = e.getPoint();
imageStartposition.setLocation(imagePosition.getLocation());
}
} // 松开鼠标时更改状态
public void mouseReleased(MouseEvent e) {
if (status == DragStatus.Dragging) {
status = DragStatus.Ready;
}
} public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
}
}); addMouseMotionListener(new MouseMotionListener() { // Java 有拖拽事件,在这个事件中移动图片位置
public void mouseDragged(MouseEvent e) {
if (status == DragStatus.Dragging) {
moveImage(e.getPoint());
}
} public void mouseMoved(MouseEvent e) {
}
});
} /**
* 移动图片。实际上画图工作在 paintComponent() 中进行,这里只是计算图片位置,然后调用该方法。
*
* @param point 当前的鼠标位置
*/
private void moveImage(Point point) {
// 图片的当前位置等于图片的起始位置加上鼠标位置的偏移量。
imagePosition.setLocation(imageStartposition.getX()
+ (point.getX() - mouseStartposition.getX()),
imageStartposition.getY()
+ (point.getY() - mouseStartposition.getY()));
repaint();
} // 打开图片
private void openImage() {
System.out.println("Opening image...");
File file = createFileChooser().getSelectedFile();
if (file != null) {
image = Toolkit.getDefaultToolkit()
.getImage(file.getAbsolutePath());
if (image != null) {
this.repaint();
}
}
} // 创建打开文件对话框
private JFileChooser createFileChooser() {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("请选择图片文件...");
chooser.addChoosableFileFilter(new FileNameExtensionFilter("常用图片格式",
"jpg", "jpeg", "gif", "png"));
chooser.showOpenDialog(this);
return chooser;
} @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, (int) imagePosition.getX(), (int) imagePosition
.getY(), this);
}
} private enum DragStatus {
Ready, Dragging
}
}
String string;
String string2;
String string3;
String string4;
String string5; public FileNameExtensionFilter(String string, String string2,
String string3, String string4, String string5) {
this.string = string;
this.string2 = string2;
this.string3 = string3;
this.string4 = string4;
this.string5 = string5;
} public FileFilter FileNameExtensionFilter(String s1, String s2, String s3,
String s4, String s5) {
return new FileNameExtensionFilter(s1, s2, s3, s4, s5); } @Override
public boolean accept(File f) {
// TODO Auto-generated method stub
return false;
} @Override
public String getDescription() {
// TODO Auto-generated method stub
return null;
}}
不知道这是否能对楼主有所启发
那么,我建议你使用仿射变换。AffineTransform使用这个操作非常方便,而且这个类就是用来处理图像的旋转,平移,放大,缩小。
用不着手动去算改编后的尺寸,位置等。
需要逻辑清晰一些。话说回来,用什么不需要逻辑清晰呢?
取出变化的坐标值
然后repaint()