如题,看代码import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class Test1 extends JPanel implements MouseListener,MouseMotionListener {
private Graphics2D g;
private int x_last=0, y_last=0;
private boolean isDragging = false;
private BasicStroke curve_stroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND );
public static void main(String args[]) {
try {
JFrame f = new JFrame();
f.setBounds(100, 100, 500, 375);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test1 frame = new Test1();
frame.addMouseMotionListener(frame);
frame.addMouseListener(frame);
f.add(frame);
f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
} public Test1() {
super();
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
});
button.setText("Paint");
add(button, BorderLayout.SOUTH);
//
}
public void update(Graphics g_){
super.update(g_);
}
public void paint(Graphics g_){
super.paint(g_);
}
public void paintComponent(Graphics g_){
super.paintComponent(g_);
} public void mousePressed(MouseEvent event) {
x_last = event.getX();
y_last = event.getY();
if(event.getButton()==MouseEvent.BUTTON1){
isDragging = true;
if(g==null){
g = (Graphics2D)getGraphics();
}
g.setXORMode(getBackground());
g.setPaint(Color.RED);
g.setStroke(curve_stroke);
setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
}
}
public void close(){
if(g!=null){
g.dispose();
g=null;
}
}
public void mouseDragged(MouseEvent event) {
if(isDragging){
repaint();
g.drawLine(x_last, y_last-3, x_last, y_last+3);
g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
}
}
public void mouseReleased(MouseEvent event) {
if(isDragging){
g.drawLine(x_last, y_last-3, x_last, y_last+3);
g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
isDragging = false;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
//p.repaint();
close();
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class Test1 extends JPanel implements MouseListener,MouseMotionListener {
private Graphics2D g;
private int x_last=0, y_last=0;
private boolean isDragging = false;
private BasicStroke curve_stroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND );
public static void main(String args[]) {
try {
JFrame f = new JFrame();
f.setBounds(100, 100, 500, 375);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test1 frame = new Test1();
frame.addMouseMotionListener(frame);
frame.addMouseListener(frame);
f.add(frame);
f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
} public Test1() {
super();
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
});
button.setText("Paint");
add(button, BorderLayout.SOUTH);
//
}
public void update(Graphics g_){
super.update(g_);
}
public void paint(Graphics g_){
super.paint(g_);
}
public void paintComponent(Graphics g_){
super.paintComponent(g_);
} public void mousePressed(MouseEvent event) {
x_last = event.getX();
y_last = event.getY();
if(event.getButton()==MouseEvent.BUTTON1){
isDragging = true;
if(g==null){
g = (Graphics2D)getGraphics();
}
g.setXORMode(getBackground());
g.setPaint(Color.RED);
g.setStroke(curve_stroke);
setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
}
}
public void close(){
if(g!=null){
g.dispose();
g=null;
}
}
public void mouseDragged(MouseEvent event) {
if(isDragging){
repaint();
g.drawLine(x_last, y_last-3, x_last, y_last+3);
g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
}
}
public void mouseReleased(MouseEvent event) {
if(isDragging){
g.drawLine(x_last, y_last-3, x_last, y_last+3);
g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
isDragging = false;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
//p.repaint();
close();
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}}
2.mouseDragged方法中不要repaint
3.画线不要覆盖,如果需要实现边拖曳边画线的效果,用连接线段的方法,每次drawLine的始点是上次drawLine的终点
每次drawLine的始点是上次drawLine的终点,这样不行我是想画直线的.
或者如果画n条曲线的话双缓冲更好使啊,画上次的缓冲图像,再画下一条线就可以了。
或者ignoreRepaint true然后再设成false
.......,再或者就是你虚拟内存不够
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class Test2 extends JPanel implements MouseListener,MouseMotionListener {
private Graphics2D g;
private int x_first,y_first, x_last, y_last=0;
private boolean isDragging = false;
private BasicStroke curve_stroke = new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND );
public static void main(String args[]) {
try {
JFrame f = new JFrame();
f.setBounds(100, 100, 500, 375);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test2 frame = new Test2();
frame.addMouseMotionListener(frame);
frame.addMouseListener(frame);
f.add(frame);
f.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
} public Test2() {
super();
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
});
button.setText("Paint");
add(button, BorderLayout.SOUTH);
}
public void update(Graphics g_){
super.update(g_);
}
public void paint(Graphics g_){
super.paint(g_);
}
public void paintComponent(Graphics g_){
super.paintComponent(g_);
g_.drawLine(x_first, y_first, x_last, y_last);
} public void mousePressed(MouseEvent event) {
x_first = event.getX();
y_first = event.getY();
if(event.getButton()==MouseEvent.BUTTON1){
isDragging = true;
if(g==null){
g = (Graphics2D)getGraphics();
}
g.setXORMode(getBackground());
g.setPaint(Color.RED);
g.setStroke(curve_stroke);
setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
}
}
public void close(){
if(g!=null){
g.dispose();
g=null;
}
}
public void mouseDragged(MouseEvent event) {
if(isDragging){
x_last=event.getX();
y_last=event.getY();
repaint();
// g.drawLine(x_first, y_first, x_last, y_last);
// g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
// g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
}
}
public void mouseReleased(MouseEvent event) {
if(isDragging){
// g.drawLine(x_last, y_last-3, x_last, y_last+3);
// g.drawLine(x_last+1, y_last, event.getX()-2, y_last);
// g.drawLine(event.getX(), y_last-3, event.getX(), y_last+3);
isDragging = false;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
close();
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) { }}