如果没有这样的方法,有的办法可以代替那?主要是在一个面板上可以draw各种图形,然后双击某个(每个图形都是独立的)图形会到另一个面板上绘制出来,在这个面板上可以像拼图一样拖拽摆放删除等功能!
解决方案 »
- String转换为InputStream
- netbeans里面jar的使用问题
- 用java怎么获取windows系统中的浏览器历史记录?
- java中class object 和 class thread下线程有什么区别
- JSP小问题
- eclipse的visual editor是VE-runtime-1.2.3_jem.zip么?
- 如何将my sql数据库中搜索的结果直接导入到excel中?
- 如何实现 Date 变量的递增?
- java不能开发出好的界面来,怀念VC++
- 怎么实现一个WEB页面的多个提交,即有多个提交按纽,提交到不同的动作页面。
- JAVA 正则问题
- 请教JBPM和JPA+Spring+Strut结合的问题
BufferedImage image;
Drawing(){
image = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D)image.getGraphics();
g2d.draw...;
} public Image getImage(){
return image;
} public void paintComponent(Graphics g){
g.drawImage(image,0,0,null);
}
}
image = new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_INT_RGB);
抛出异常啊!
java.lang.reflect.InvocationTargetException
这是什么啊?
如果你想做到每个元素都可以拖拉,实际上你就应该先记录总共有哪些元素。然后在paint方法中先清空再将列表中的所有元素重画一次
嘿嘿你说的我也不懂~我是初学者!我在网上找的画板程序~想把它画出来的图形进行操作!package bagone;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.Border;public class DrawShapes extends JFrame {
private static final long serialVersionUID = 3685715844170953607L;
// 作图面板
private CVS cvs;
// 作图方式选择按钮
private JToggleButton cycle, line, rect,arc,rgb;
private JLabel red, blue, green;
private ButtonGroup bgroup;
// 按钮布局面板
private JPanel menuPanel;
// 复位按钮
private JButton clean;
private JColorChooser chooser = null;
static Color c = new Color(0, 0, 0); public DrawShapes() {
super("Java");
// this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(640, 480);
this.setLocationRelativeTo(null);
this.getContentPane().add(cvs = new CVS());
this.initComponents();
} // 初始化组件
private void initComponents() {
this.menuPanel = new JPanel(null);
this.menuPanel.setPreferredSize(new Dimension(400, 28));
this.menuPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
this.getContentPane().add(this.menuPanel, "South");
this.bgroup = new ButtonGroup();
this.cycle = new JToggleButton("圆形");
this.cycle.setBounds(20, 4, 68, 20);
this.line = new JToggleButton("直线");
this.line.setBounds(100, 4, 68, 20);
this.rect = new JToggleButton("矩形");
this.rect.setBounds(180, 4, 68, 20);
this.arc = new JToggleButton("扇形");
this.arc.setBounds(260, 4, 68, 20);
this.rgb = new JToggleButton("颜色");
this.rgb.setBounds(340, 4, 68, 20);
red = new JLabel();
red.setOpaque(true);
red.setBackground(Color.red);
red.setBounds(258+300, 4, 20, 20);
blue = new JLabel();
blue.setOpaque(true);
blue.setBackground(Color.blue);
blue.setBounds(282+300, 4, 20, 20);
green = new JLabel();
green.setBackground(Color.green);
green.setOpaque(true);
green.setBounds(306+300, 4, 20, 20);
this.menuPanel.add(cycle);
this.menuPanel.add(line);
this.menuPanel.add(rect);
this.menuPanel.add(rgb);
this.menuPanel.add(arc);
this.bgroup.add(cycle);
this.bgroup.add(line);
this.bgroup.add(rect);
this.bgroup.add(rgb);
this.bgroup.add(arc);
this.clean = new JButton("清除");
this.clean.setBounds(420, 4, 68, 20);
this.menuPanel.add(clean);
// 按钮动作侦听器实例
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
if (src.equals(cycle)) {
cvs.DRAWSTATE=cvs.CYCLE;
} else if (src.equals(line)) {
cvs.DRAWSTATE=cvs.LINE;// 画直线
} else if (src.equals(rect)) {
cvs.DRAWSTATE=cvs.RECTANGLE;
// cvs.setSX(SXXX.RECTANGLE);// 画矩形
} else if (src.equals(clean)) {
cvs.reset();// 复位
} else if (src.equals(arc)) {
new SetArc();
cvs.DRAWSTATE=cvs.ARC;
} else if (src.equals(rgb)) {
Color newColor = JColorChooser.showDialog(null, "调色板", c);
c = newColor;
}
}
};
// 给按钮注册侦听器
this.cycle.addActionListener(al);
this.line.addActionListener(al);
this.rect.addActionListener(al);
this.clean.addActionListener(al);
this.arc.addActionListener(al);
this.rgb.addActionListener(al);
// MouseListener ml = new MouseAdapter() {
// public void mousePressed(MouseEvent e) {
// Object s = e.getSource();
// Border b = BorderFactory.createLoweredBevelBorder();
// if (s.equals(red)) {
// red.setBorder(b);
// blue.setBorder(null);
// green.setBorder(null);
// } else if (s.equals(blue)) {
// blue.setBorder(b);
// red.setBorder(null);
// green.setBorder(null);
// } else if (s.equals(green)) {
// green.setBorder(b);
// blue.setBorder(null);
// red.setBorder(null);
// }
// }
// };
// blue.addMouseListener(ml);
// red.addMouseListener(ml);
// green.addMouseListener(ml);
} // 程序入口
public static void main(String[] aregs) throws Exception {
// 调用系统视觉设置
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DrawShapes().setVisible(true);
}
});
}
}我改来改去也改不明白~~谁能帮我看看!!就是这个程序!
// 主作图面板类,可接收一般鼠标事件和鼠标拖动事件
class CVS extends Canvas implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 5585026114112579483L; // 指定图形的第一点,比如矩形的角点,圆形的圆心,直线的第一点
private int x, y;
// 作图大小
private int w, h;
// 作图类型控制
public int DRAWSTATE = 0;
public final int CYCLE = 60, RECTANGLE = 61, LINE = 62, ARC = 63;
// 双缓冲,背景缓冲区和临时缓冲区
private BufferedImage background, buff;
// 图像更新标记
private boolean hasChanged;
// 背景色,临时作图色,前景色
private Color bgc = Color.white;
public CVS() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
} // 绘制临时缓冲区
private void drawing(int X, int Y) {
Graphics g = buff.getGraphics();
g.setColor(bgc);
g.clearRect(0, 0, w, h);
copyBuffer();
g.setColor(DrawShapes.c);
Point p = new Point(x, y);
Point2D p2 = new Point2D.Double(X, Y);
int dist = (int) p.distance(p2);
int dx = x - X;
dx = Math.abs(dx);
int dy = y - Y;
dy = Math.abs(dy);
switch (DRAWSTATE) {
case CYCLE:
g.fillOval(x < X ? x : X, y < Y ? y : Y, dx, dy);
break;
case LINE:
g.drawLine(x, y, X, Y);
break;
case RECTANGLE:
g.fillRect(x < X ? x : X, y < Y ? y : Y, dx, dy);
break;
case ARC:
g.fillArc(x < X ? x : X, y < Y ? y : Y, dx, dy,SetArc.ArcA,SetArc.ArcB);
break;
}
g.dispose();
drawBufferToCVS();
}
// 绘制背景缓冲区
private void drawBuffer(int X, int Y) {
Graphics2D gd = background.createGraphics();
gd.setColor(DrawShapes.c);
gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Point p = new Point(x, y);
Point2D p2 = new Point2D.Double(X, Y);
int dist = (int) p.distance(p2);
int dx = x - X;
dx = Math.abs(dx);
int dy = y - Y;
dy = Math.abs(dy);
switch (DRAWSTATE) {
case CYCLE:
//画正圆
gd.fillOval(x < X ? x : X, y < Y ? y : Y, dx, dy);
break;
case LINE:
gd.drawLine(x, y, X, Y);
break;
case RECTANGLE:
gd.fillRect(x < X ? x : X, y < Y ? y : Y, dx, dy);
break;
case ARC:
gd.fillArc(x < X ? x : X, y < Y ? y : Y, dx, dy,SetArc.ArcA,SetArc.ArcB);
break;
default:
popupMsg();
}
gd.dispose();
Graphics g = this.getGraphics();
g.clearRect(0, 0, w, h);
g.drawImage(background, 0, 0, null);
g.dispose();
} private void popupMsg() {
JOptionPane.showMessageDialog(this, "请选择一种作图方式开始作图.");
} // 复制背景缓冲区内容到临时缓冲区
private void copyBuffer() {
Graphics g = buff.getGraphics();
g.drawImage(background, 0, 0, null);
g.dispose();
} // 印出临时缓冲区内容到窗口
private void drawBufferToCVS() {
Graphics g = this.getGraphics();
g.drawImage(buff, 0, 0, null);
System.out.println(" buff : " + buff.getWidth()+" " + buff.getHeight());
g.dispose();
} // 清除双缓冲区并清除窗口内容
public void reset() {
clearContents(buff);
clearContents(background);
Graphics g = this.getGraphics();
g.setColor(bgc);
g.fillRect(0, 0, w, h);
g.dispose();
} // 清除指定缓冲区内容
private void clearContents(BufferedImage i) {
Graphics g = i.getGraphics();
g.setColor(bgc);
g.fillRect(0, 0, w, h);
g.dispose();
} // 初始化缓冲区
private void initImages() {
background = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
buff = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
clearContents(background);
clearContents(buff);
} // 重写此方法,以便在窗口重新显示时能正确显示最后的内容.
public void paint(Graphics g) {
if (background == null) {
w = this.getToolkit().getScreenSize().width;
h = this.getToolkit().getScreenSize().height;
initImages();
}
g.drawImage(background, 0, 0, null);
g.dispose();
} // 双击作图区也能做清除动作,呵呵
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2)
reset();
} public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
} // 每当按下鼠标时就重新设置第一点的坐标
public void mousePressed(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
} // 每当释放鼠标时就决定是否需要将背景缓冲区印出到窗口
public void mouseReleased(MouseEvent e) {
if (hasChanged) {
hasChanged = false;
drawBuffer(e.getX(), e.getY());
}
} // 每当鼠标拖动时开始作图
public void mouseDragged(MouseEvent e) {
hasChanged = true;
drawing(e.getX(), e.getY());
} public void mouseMoved(MouseEvent e) {
}
}