问题描述
在java做的画图板中,如何选中一个已经画好的图形,把它放大、缩小、移动???类似windows的画图板功能,急呀,大牛们帮帮忙
解决方案
解决方案二:
你要做图形处理的话,在画这个图形的时候就要把图形的数据保存起来,例如:直线就要保存两个端点的坐标,圆就要保存圆心坐标和半径。然后根据操作,对保存的数据进行相应的处理,再重画图形。建议看下图形学的一些知识。
解决方案三:
可是我只是个菜鸟,不会那些呀,怎么能选中图形呢?
解决方案四:
packageaa;importjavax.swing.*;importjavax.swing.filechooser.*;importjava.awt.*;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjava.io.File;/***在窗体上拖拽图片。使用方法:双击窗体空白处将会弹出打开图片对话框。打开图片后可以在窗体上拖拽图片。*/publicclassDragingFrameextendsJFrame{/***构造函数**@throwsHeadlessException???*/publicDragingFrame()throwsHeadlessException{this.setDefaultCloseOperation(EXIT_ON_CLOSE);getContentPane().setLayout(newBorderLayout());getContentPane().add(newImagePanel(),BorderLayout.CENTER);}//程序入口publicstaticvoidmain(String[]args)throwsException{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());DragingFrameframe=newDragingFrame();frame.setSize(400,300);frame.setLocation(300,300);frame.setResizable(false);frame.setTitle("双击打开图片,然后拖拽");frame.setVisible(true);}}/***能够拖拽图片的面板*/classImagePanelextendsJPanel{privateDragStatusstatus=DragStatus.Ready;//拖拽状态privateImageimage;//要显示的图片privatePointimagePosition=newPoint(0,0),//图片的当前位置imageStartposition=newPoint(0,0),//每次拖拽开始时图片的位置(也就是上次拖拽后的位置)mouseStartposition;//每次拖拽开始时鼠标的位置ImagePanel(){addMouseListener(newMouseListener(){//双击鼠标时打开图片publicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){openImage();}}//按下鼠标时,更改状态,并且记录拖拽起始位置。publicvoidmousePressed(MouseEvente){if(status==DragStatus.Ready){status=DragStatus.Dragging;mouseStartposition=e.getPoint();imageStartposition.setLocation(imagePosition.getLocation());}}//松开鼠标时更改状态publicvoidmouseReleased(MouseEvente){if(status==DragStatus.Dragging){status=DragStatus.Ready;}}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}});addMouseMotionListener(newMouseMotionListener(){//Java有拖拽事件,在这个事件中移动图片位置publicvoidmouseDragged(MouseEvente){if(status==DragStatus.Dragging){moveImage(e.getPoint());}}publicvoidmouseMoved(MouseEvente){}});}/***移动图片。实际上画图工作在paintComponent()中进行,这里只是计算图片位置,然后调用该方法。**@parampoint当前的鼠标位置*/privatevoidmoveImage(Pointpoint){//图片的当前位置等于图片的起始位置加上鼠标位置的偏移量。imagePosition.setLocation(imageStartposition.getX()+(point.getX()-mouseStartposition.getX()),imageStartposition.getY()+(point.getY()-mouseStartposition.getY()));repaint();}//打开图片privatevoidopenImage(){System.out.println("Openingimage...");Filefile=createFileChooser().getSelectedFile();if(file!=null){image=Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath());if(image!=null){this.repaint();}}}//创建打开文件对话框privateJFileChoosercreateFileChooser(){JFileChooserchooser=newJFileChooser();chooser.setDialogTitle("请选择图片文件...");chooser.addChoosableFileFilter(newFileNameExtensionFilter("常用图片格式","jpg","jpeg","gif","png"));chooser.showOpenDialog(this);returnchooser;}@OverrideprotectedvoidpaintComponent(Graphicsg){super.paintComponent(g);if(image!=null){g.drawImage(image,(int)imagePosition.getX(),(int)imagePosition.getY(),this);}}privateenumDragStatus{Ready,Dragging}}
解决方案五:
packageaa;importjava.io.File;importjavax.swing.filechooser.FileFilter;publicclassFileNameExtensionFilterextendsFileFilter{Stringstring;Stringstring2;Stringstring3;Stringstring4;Stringstring5;publicFileNameExtensionFilter(Stringstring,Stringstring2,Stringstring3,Stringstring4,Stringstring5){this.string=string;this.string2=string2;this.string3=string3;this.string4=string4;this.string5=string5;}publicFileFilterFileNameExtensionFilter(Strings1,Strings2,Strings3,Strings4,Strings5){returnnewFileNameExtensionFilter(s1,s2,s3,s4,s5);}@Overridepublicbooleanaccept(Filef){//TODOAuto-generatedmethodstubreturnfalse;}@OverridepublicStringgetDescription(){//TODOAuto-generatedmethodstubreturnnull;}}
解决方案六:
我对楼主的建议就是,实时获取panel的大小,设定比例参数,再调用repaint()方法不知道这是否能对楼主有所启发。。。。。。
解决方案七:
如果你使用了graphics或者graphics2d那么,我建议你使用仿射变换。AffineTransform使用这个操作非常方便,而且这个类就是用来处理图像的旋转,平移,放大,缩小。用不着手动去算改编后的尺寸,位置等。需要逻辑清晰一些。话说回来,用什么不需要逻辑清晰呢?
解决方案八:
用什么不需要逻辑清晰呢?
解决方案九:
设置事件侦听器,比如onmouseupondrag之类的取出变化的坐标值然后repaint()
解决方案十:
我也有类似的问题……
解决方案十一:
能否请高手发个相关的能实现选中图形,并能移动放缩的Java画图板程序。我也是新手,想知道这个怎么解决。