如题,我用Java的JAI打开一幅图像,但不知怎样在该图像上画矩形
关键代码如下:JFrame frame = new JFrame();
DisplayJAI dd = new DisplayJAI(image);
final JScrollPane sp = new JScrollPane(dd);
Container contentPane = frame.getContentPane();
contentPane.add(sp,BorderLayout.CENTER);
frame.setSize(500,600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);sp.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e){
x1 = (int)e.getPoint().getX();
y1 = (int)e.getPoint().getY();
} @Override
public void mouseReleased( MouseEvent e ) {
x2 = (int)e.getPoint().getX();
y2 = (int)e.getPoint().getY();
x = Math.min( x1, x2 );
y = Math.min( y1, y2 );
w = Math.abs( x1 - x2 );
h = Math.abs( y1 - y2 );
sp.repaint();
} @Override
public void mouseDragged( MouseEvent e ) {
x2 = (int)e.getPoint().getX();
y2 = (int)e.getPoint().getY();
x = Math.min( x1, x2 );
y = Math.min( y1, y2 );
w = Math.abs( x1 - x2 );
h = Math.abs( y1 - y2 );
Rectangle rt = new Rectangle( x, y, w, h);
sp.repaint();
}
});
// 如何实现这些repaint()?
// 在sp.addMouseListener(new MouseAdapter(){……})之前加入protected void paintComponent( Graphics g ){} 有错,无法实现repaint(); 不知道怎么办好 了
先谢谢各位了!
关键代码如下:JFrame frame = new JFrame();
DisplayJAI dd = new DisplayJAI(image);
final JScrollPane sp = new JScrollPane(dd);
Container contentPane = frame.getContentPane();
contentPane.add(sp,BorderLayout.CENTER);
frame.setSize(500,600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);sp.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e){
x1 = (int)e.getPoint().getX();
y1 = (int)e.getPoint().getY();
} @Override
public void mouseReleased( MouseEvent e ) {
x2 = (int)e.getPoint().getX();
y2 = (int)e.getPoint().getY();
x = Math.min( x1, x2 );
y = Math.min( y1, y2 );
w = Math.abs( x1 - x2 );
h = Math.abs( y1 - y2 );
sp.repaint();
} @Override
public void mouseDragged( MouseEvent e ) {
x2 = (int)e.getPoint().getX();
y2 = (int)e.getPoint().getY();
x = Math.min( x1, x2 );
y = Math.min( y1, y2 );
w = Math.abs( x1 - x2 );
h = Math.abs( y1 - y2 );
Rectangle rt = new Rectangle( x, y, w, h);
sp.repaint();
}
});
// 如何实现这些repaint()?
// 在sp.addMouseListener(new MouseAdapter(){……})之前加入protected void paintComponent( Graphics g ){} 有错,无法实现repaint(); 不知道怎么办好 了
先谢谢各位了!
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;import javax.swing.JFrame;
import javax.swing.JPanel;
//这就是一个窗口
public class Paint extends JFrame{
public static void main( String[] args ) {
new Paint();
}
public Paint() {
getContentPane().add( new Canvas(null), BorderLayout.CENTER );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setSize(500,600);
setLocationRelativeTo( null );
setVisible(true);
}
}//这个类充当了一个画板的角色
class Canvas extends JPanel{
private List<Shape> shapes = new ArrayList<Shape>();
private Image background = null;
private Shape tmp = null;
public Canvas (Image background) {
this.background = background;
AmouseListener al = new AmouseListener();
this.addMouseListener( al );
this.addMouseMotionListener( al );
}
//所有的作画操作在这里
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
g.setColor( Color.WHITE );
if( background != null ) {
int iWidth = background.getWidth( this );
int iHeight = background.getHeight( this );
g.drawImage( background, 0, 0, iWidth, iHeight, this );
}else {
g.fillRect( 0, 0, this.getWidth(), this.getHeight() );
}
g.setColor( Color.RED );
Graphics2D g2 = (Graphics2D)g;
for(int i=0;i<shapes.size();i++) {
g2.draw( shapes.get( i ) );
}
if( tmp != null ) {
g2.setColor( Color.BLUE );
g2.draw( tmp );
tmp = null;
}
}
//监听鼠标事件的监听器
class AmouseListener extends MouseAdapter{
private Point start = null;
private Point end = null;
public void mousePressed( MouseEvent e ) {
start = e.getPoint();
} public void mouseReleased( MouseEvent e ) {
end = e.getPoint();
shapes.add( getRect( start, end ) );
Canvas.this.repaint();
}
private Rectangle getRect(Point p1, Point p2) {
int x1 = (int) p1.getX();
int y1 = (int) p1.getY();
int x2 = (int) p2.getX();
int y2 = (int) p2.getY();
int x = Math.min( x1, x2 );
int y = Math.min( y1, y2 );
int w = Math.abs( x1 - x2 );
int h = Math.abs( y1 - y2 );
Rectangle rt = new Rectangle(x,y,w,h);
return rt;
} public void mouseDragged( MouseEvent e ) {
Rectangle rt = getRect( start, e.getPoint() );
Canvas.this.tmp = rt;
Canvas.this.repaint();
}
}
}
而我的程序用DisplayJAI dd = new DisplayJAI(image);和final JScrollPane sp = new JScrollPane(dd);显示图像,要画矩形必须使用protected void paintComponent( Graphics g ){} (我的理解,说得不对别见怪),而paintComponent( Graphics g ){……}有错,我很郁闷
修改后的程序如下,但仍然不能成功画出矩形:
class Paint {
public Paint(PlanarImage image){
String path = null;
JFrame frame = new JFrame();
DisplayJAI dd = new DisplayJAI(image);
JScrollPane sp = new JScrollPane(new Canvas(dd));
frame.add(sp,BorderLayout.CENTER);
frame.setSize(500,600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
} class Canvas extends JPanel{
int x, y, x1, y1, x2, y2, w, h;
public Canvas(DisplayJAI dd){
this.add(dd);
AmouseListener al = new AmouseListener();
this.addMouseListener( al );
this.addMouseMotionListener( al );
}
@Override
protected void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.RED);
g2.drawRect(x, y, w, h);
} //监听鼠标事件的监听器
class AmouseListener extends MouseAdapter{
@Override
public void mousePressed( MouseEvent e ) {
x1 = (int)e.getPoint().getX();
y1 = (int)e.getPoint().getY();
} @Override
public void mouseReleased( MouseEvent e ) {
x2 = (int)e.getPoint().getX();
y2 = (int)e.getPoint().getY();
x = Math.min( x1, x2 );
y = Math.min( y1, y2 );
w = Math.abs( x1 - x2 );
h = Math.abs( y1 - y2 );
Canvas.this.repaint();
} @Override
public void mouseDragged( MouseEvent e ) {
x2 = (int)e.getPoint().getX();
y2 = (int)e.getPoint().getY();
x = Math.min( x1, x2 );
y = Math.min( y1, y2 );
w = Math.abs( x1 - x2 );
h = Math.abs( y1 - y2 );
Canvas.this.repaint();
}
}
}