兄弟帮下忙!感激不尽!JAVA2D绘图中怎么实现画的图象被选中?还有实现图象的移动? JAVA2D绘图中怎么实现画的图象被选中?还有实现图象的移动?这个问题搞到我好痛苦!日思夜想! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找了一个java的画图程序,希望有帮助;/* * 画图程序 来自bc-cn论坛 * java applet 与windows自带的程序类似,功能简单 * * */import java.awt.BasicStroke;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.util.Iterator;import java.util.LinkedList;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JColorChooser;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JPanel;public class Test extends JPanel implements Runnable,ActionListener,MouseListener,MouseMotionListener { private JButton clear,draw,replay,btnColor;//清除,开始画和重放和颜色的按钮 Color choosedColor = Color.BLACK;//选中的颜色 JDialog dialog = null; private LinkedList<MyShape> save;//保存起来的形状 private int flag=0;//定义一个标志,用它来传递当前是在干什么 private final int DRAW=1;//1代表当前正在画图 private final int REPLAY=2;//2代表当前正在重放 private LinkedList<Pen> ps;//保存点 private volatile boolean go; /** Creates a new instance of Test */ public Test() { initOther(); initWindow(); } private void initOther(){ clear=new JButton("清除"); draw=new JButton("开始画"); replay=new JButton("重放"); btnColor = new JButton("选取颜色");//选颜色 clear.addActionListener(this); draw.addActionListener(this); replay.addActionListener(this); save=new LinkedList<MyShape>(); ps=new LinkedList<Pen>(); clear.setEnabled(false); replay.setEnabled(false); } private void initWindow(){ JFrame jf=new JFrame("画板 Dream "); JPanel down=new JPanel(); down.add(clear); down.add(draw); down.add(replay); down.add(btnColor); this.setBorder(BorderFactory.createTitledBorder("绘画区")); jf.add(this,BorderLayout.CENTER); jf.add(down,BorderLayout.SOUTH); jf.setSize(500,450); jf.setLocationRelativeTo(null); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btnColor.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { final JColorChooser chooser = new JColorChooser(); dialog = JColorChooser.createDialog(null, "选取颜色", false, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { choosedColor = chooser.getColor(); } }, null); dialog.setVisible(true); } }); } protected void paintComponent(Graphics g){ super.paintComponent(g); if(flag==DRAW){ for(MyShape my:save){ my.drawMe(g); } Point previous=null; for(Pen pp:ps){ Point p = pp.getP(); if(previous!=null) { Graphics2D g2 = (Graphics2D)g; g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2)); g.setColor(pp.getColor()); g.drawLine(previous.x,previous.y,p.x,p.y); } previous=p; } }else if(flag==REPLAY){ try{ for(MyShape my:save){ if(my.hasNext()){ my.drawNext(g); return; }else{ my.drawMe(g); } } for(MyShape my:save) { my.reset(); } go=false; replay.setEnabled(true); draw.setEnabled(true); } catch(Exception exe){ exe.printStackTrace(); } } } public void run(){ while(go){ try{ Thread.sleep(20); repaint(); } catch(Exception exe){ exe.printStackTrace(); } } flag=DRAW; repaint(); } public void actionPerformed(ActionEvent e) { Object source=e.getSource(); if(source==clear){ save.clear(); replay.setEnabled(false); repaint(); }else if(source==draw){ flag=DRAW; this.addMouseListener(this); this.addMouseMotionListener(this); draw.setEnabled(false); clear.setEnabled(true); }else if(source==replay){ flag=REPLAY; this.removeMouseListener(this); this.removeMouseMotionListener(this); replay.setEnabled(false); draw.setEnabled(false); clear.setEnabled(false); go=true; new Thread(this).start(); } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { Point p=e.getPoint(); Pen pp = new Pen(p,choosedColor); replay.setEnabled(false); ps.offer(pp); repaint(); } public void mouseReleased(MouseEvent e) { replay.setEnabled(true); Pen pp = new Pen(e.getPoint(),choosedColor); save.add(new MyLine(ps)); ps=new LinkedList<Pen>(); repaint(); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { Pen pp = new Pen(e.getPoint(),choosedColor); ps.offer(pp); repaint(); } public void mouseMoved(MouseEvent e) { } public static void main(String[] args) { new Test(); }} 继续//定义了一个接口,它规定了重绘自己的方法interface MyShape{ void drawMe(Graphics g);//一下子画出自己 boolean hasNext();//是否还有下一个状态 void drawNext(Graphics g);//画出自己下一个样子 void reset();//重置一下}class Pen{ private Point p; private Color color; Pen(Point p,Color color) { this.p = p; this.color = color; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public Point getP() { return p; } public void setP(Point p) { this.p = p; } }class MyLine implements MyShape{ private LinkedList<Pen> ll;//用来保存点 private Iterator<Pen> it;//一个迭代器 private LinkedList<Pen> over;//保存已经画过的点 public MyLine(LinkedList<Pen> ll){ this.ll=ll; it=ll.iterator(); over=new LinkedList<Pen>(); } public void drawMe(Graphics g) { Point previous=ll.getFirst().getP(); for(Pen pp:ll){ Point p = pp.getP(); Graphics2D g2 = (Graphics2D)g; g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2)); g.setColor(pp.getColor()); g.drawLine(previous.x,previous.y,p.x,p.y); previous=p; } } public boolean hasNext() { return it.hasNext(); } public void drawNext(Graphics g) { over.add(it.next()); Point previous=over.getFirst().getP(); for(Pen pp:over){ Point p = pp.getP(); Graphics2D g2 = (Graphics2D)g; g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2)); g.setColor(pp.getColor()); g.drawLine(previous.x,previous.y,p.x,p.y); previous=p; } } public void reset(){ it=ll.iterator(); over.clear(); }} sunny3106(),那个my:save是什么意思啊 ?“:”这个字符是表达什么?有没人知道? for(MyShape my:save){ my.drawMe(g);}for增强版与for-each相同功能,上面代码可以改为:for(int i=0;i<save.size();i++){ MyShape my = save.get(i); my.drawMe(g);} private LinkedList<MyShape> save;怎么编译错误的? LinkedList<MyShape>:泛型(也有叫模板的),需要1.5或以上的JDK支持 如果是1.5以下版本的,private LinkedList<MyShape> save;这个需要怎么编译呢? 把<MyShape>去掉,但是後面很多地方都要進行“拆箱”,foreach也不可以再用了,比較麻煩。還是升級JDK吧,可以多學不少東西的。 类继承出问题了!求解 求官方的The Java Tutorial 下载地址 高分求助如何写下面的正则表达式 try异常 html解析的问题,如何发现html标签没有结束 有一段javascript,是四六级准考证号的...大家谁给解释一下?? 查找一个字符串中字符出现次数,解决马上给分 打印界面,有时出现异常,急,在线等待。 简单问题,赖看看呀 文件合并的问题 我在日文系统下,取出了中文字体,奇怪 关于finalize()
* 画图程序 来自bc-cn论坛
* java applet 与windows自带的程序类似,功能简单
*
*
*/
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JPanel implements Runnable,ActionListener,MouseListener,MouseMotionListener {
private JButton clear,draw,replay,btnColor;//清除,开始画和重放和颜色的按钮
Color choosedColor = Color.BLACK;//选中的颜色
JDialog dialog = null;
private LinkedList<MyShape> save;//保存起来的形状
private int flag=0;//定义一个标志,用它来传递当前是在干什么
private final int DRAW=1;//1代表当前正在画图
private final int REPLAY=2;//2代表当前正在重放
private LinkedList<Pen> ps;//保存点
private volatile boolean go;
/** Creates a new instance of Test */
public Test() {
initOther();
initWindow();
}
private void initOther(){
clear=new JButton("清除");
draw=new JButton("开始画");
replay=new JButton("重放");
btnColor = new JButton("选取颜色");//选颜色
clear.addActionListener(this);
draw.addActionListener(this);
replay.addActionListener(this);
save=new LinkedList<MyShape>();
ps=new LinkedList<Pen>();
clear.setEnabled(false);
replay.setEnabled(false);
}
private void initWindow(){
JFrame jf=new JFrame("画板 Dream ");
JPanel down=new JPanel();
down.add(clear);
down.add(draw);
down.add(replay);
down.add(btnColor);
this.setBorder(BorderFactory.createTitledBorder("绘画区"));
jf.add(this,BorderLayout.CENTER);
jf.add(down,BorderLayout.SOUTH);
jf.setSize(500,450);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnColor.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
final JColorChooser chooser = new JColorChooser();
dialog = JColorChooser.createDialog(null, "选取颜色", false, chooser, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
choosedColor = chooser.getColor();
}
}, null);
dialog.setVisible(true);
}
});
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
if(flag==DRAW){
for(MyShape my:save){
my.drawMe(g);
}
Point previous=null;
for(Pen pp:ps){
Point p = pp.getP();
if(previous!=null)
{
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2));
g.setColor(pp.getColor());
g.drawLine(previous.x,previous.y,p.x,p.y);
}
previous=p;
}
}else if(flag==REPLAY){
try{
for(MyShape my:save){
if(my.hasNext()){
my.drawNext(g);
return;
}else{
my.drawMe(g);
}
}
for(MyShape my:save)
{
my.reset();
}
go=false;
replay.setEnabled(true);
draw.setEnabled(true);
} catch(Exception exe){
exe.printStackTrace();
}
}
}
public void run(){
while(go){
try{
Thread.sleep(20);
repaint();
} catch(Exception exe){
exe.printStackTrace();
}
}
flag=DRAW;
repaint();
}
public void actionPerformed(ActionEvent e) {
Object source=e.getSource();
if(source==clear){
save.clear();
replay.setEnabled(false);
repaint();
}else if(source==draw){
flag=DRAW;
this.addMouseListener(this);
this.addMouseMotionListener(this);
draw.setEnabled(false);
clear.setEnabled(true);
}else if(source==replay){
flag=REPLAY;
this.removeMouseListener(this);
this.removeMouseMotionListener(this);
replay.setEnabled(false);
draw.setEnabled(false);
clear.setEnabled(false);
go=true;
new Thread(this).start();
}
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
Point p=e.getPoint();
Pen pp = new Pen(p,choosedColor);
replay.setEnabled(false);
ps.offer(pp);
repaint();
}
public void mouseReleased(MouseEvent e) {
replay.setEnabled(true);
Pen pp = new Pen(e.getPoint(),choosedColor);
save.add(new MyLine(ps));
ps=new LinkedList<Pen>();
repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
Pen pp = new Pen(e.getPoint(),choosedColor);
ps.offer(pp);
repaint();
}
public void mouseMoved(MouseEvent e) {
}
public static void main(String[] args) {
new Test();
}
}
interface MyShape{
void drawMe(Graphics g);//一下子画出自己
boolean hasNext();//是否还有下一个状态
void drawNext(Graphics g);//画出自己下一个样子
void reset();//重置一下
}class Pen
{
private Point p;
private Color color;
Pen(Point p,Color color)
{
this.p = p;
this.color = color;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Point getP() {
return p;
}
public void setP(Point p) {
this.p = p;
}
}class MyLine implements MyShape{
private LinkedList<Pen> ll;//用来保存点
private Iterator<Pen> it;//一个迭代器
private LinkedList<Pen> over;//保存已经画过的点
public MyLine(LinkedList<Pen> ll){
this.ll=ll;
it=ll.iterator();
over=new LinkedList<Pen>();
}
public void drawMe(Graphics g)
{
Point previous=ll.getFirst().getP();
for(Pen pp:ll){
Point p = pp.getP();
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2));
g.setColor(pp.getColor());
g.drawLine(previous.x,previous.y,p.x,p.y);
previous=p;
}
}
public boolean hasNext() {
return it.hasNext();
}
public void drawNext(Graphics g)
{
over.add(it.next());
Point previous=over.getFirst().getP();
for(Pen pp:over){
Point p = pp.getP();
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,2));
g.setColor(pp.getColor());
g.drawLine(previous.x,previous.y,p.x,p.y);
previous=p;
}
}
public void reset(){
it=ll.iterator();
over.clear();
}
}
my.drawMe(g);
}
for增强版与for-each相同功能,上面代码可以改为:
for(int i=0;i<save.size();i++){
MyShape my = save.get(i);
my.drawMe(g);
}
還是升級JDK吧,可以多學不少東西的。