[求助] 关于画板程序中画一个根据鼠标拖拽变化的动态矩形实现方法
如何让矩形随着鼠标移动而变化,同时把上一个矩形擦掉而不擦掉背景呢!求救 --------------------编程问答-------------------- 百度:java双缓冲
把背景重新画上去就行了 --------------------编程问答--------------------
--------------------编程问答-------------------- 双缓冲OK!
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
*
* @author raistlic
* @date Dec 20, 2012
*/
public class RecPanel extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Rectangle Panel");
f.getContentPane().add(new RecPanel(), BorderLayout.CENTER);
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);
}
});
}
private Point start;
private Point end;
RecPanel() {
start = new Point(0, 0);
end = new Point(0, 0);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
start.x = x;
start.y = y;
end.x = x;
end.y = y;
repaint();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
end.x = e.getX();
end.y = e.getY();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if( !end.equals(start) ) {
g.setColor(getForeground());
int x = Math.min(start.x, end.x);
int y = Math.min(start.y, end.y);
int width = Math.max(start.x, end.x) - x;
int height = Math.max(start.y, end.y) - y;
g.drawRect(x, y, width, height);
}
}
}
这个效果不是是不是?
--------------------编程问答-------------------- 如果是要保留已经画好的矩形,然后后来的矩形覆盖原来矩形的效果:
package test;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class Test extends JFrame{
int x0,y0,x1,y1;
Test(){
setSize(600, 400);
setVisible(true);
addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
x0=e.getX();
y0=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
x1=e.getX();
y1=e.getY();
drawRec();
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
}
void drawRec(){
repaint();
}
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.setColor(new Color(222,0,0));
g.drawRect(x0, y0, x1-x0, y1-y0);
}
public static void main(String []args){
new Test();
}
}
--------------------编程问答--------------------
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
*
* @author raistlic
* @date Dec 20, 2012
*/
public class RecPanel extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Rectangle Panel");
f.getContentPane().add(new RecPanel(), BorderLayout.CENTER);
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);
}
});
}
private Point start;
private Point end;
private List<Rectangle> drawn;
RecPanel() {
start = new Point(0, 0);
end = new Point(0, 0);
drawn = new LinkedList<Rectangle>();
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
start.x = x;
start.y = y;
end.x = x;
end.y = y;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
if( !end.equals(start) ) {
drawn.add(getCurrentRect());
Point curr = e.getPoint();
start = new Point(curr);
end = new Point(curr);
}
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
end.x = e.getX();
end.y = e.getY();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
@SuppressWarnings("unchecked")
Graphics2D gg = (Graphics2D)g.create();
gg.setColor(getForeground());
gg.setBackground(getBackground());
for(Rectangle r : drawn) {
gg.clearRect(r.x, r.y, r.width, r.height);
gg.drawRect(r.x, r.y, r.width, r.height);
}
if( !end.equals(start) ) {
Rectangle r = getCurrentRect();
gg.clearRect(r.x, r.y, r.width, r.height);
gg.drawRect(r.x, r.y, r.width, r.height);
}
gg.dispose();
}
private Rectangle getCurrentRect() {
int x = Math.min(start.x, end.x);
int y = Math.min(start.y, end.y);
int width = Math.max(start.x, end.x) - x;
int height = Math.max(start.y, end.y) - y;
return new Rectangle(x, y, width, height);
}
}
谢谢
补充:Java , Java SE