概述
今天感觉好久没有写过Java的界面程序,然后去网上照着某些源代码写了一个Demo,通过鼠标的移动、拖拽来画一条直线,但是JFrame根本不会把画布清除掉。代表如下:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import commons.LocateCenter;
public class MouseListenersDemo1 {
private JFrame frame;
int flag; //flag = 1代表 mouse moved
//flag = 2代表mouse dragged
int x = 0;
int y = 0;
int startX, startY, endX, endY;
@SuppressWarnings("serial")
public MouseListenersDemo1(){
frame = new JFrame(){
@Override
public void update( Graphics g ){
g.setColor( getBackground() );
g.fillRect( 0, 0, getWidth(), getHeight() );
paint( g );
}
@Override
public void paint( Graphics g ){
g.setColor( Color.black );
if( flag == 1 ){
g.drawString( "移动鼠标坐标: ( "+x + ", " + y + " )", 10, 50 );
g.drawLine( startX, startY, endX, endY );
}
if( flag == 2 ){
g.drawString( "拖拽鼠标坐标: (" + x + ", " + y + " )", 10, 50 );
g.drawLine( startX, startY, x, y );
}
}
};
Container contentPanel = frame.getContentPane();
contentPanel.addMouseListener( ml );
contentPanel.addMouseMotionListener( mml );
frame.setBounds( new LocateCenter( 500, 300 ) );
//show();
frame.addWindowListener( new WindowAdapter(){
public void windowClosing( WindowEvent e ){
System.exit( -1 );
}
});
}
MouseListener ml = new MouseListener(){
@Override
public void mouseClicked(MouseEvent arg0 ) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent e ) {
startX = e.getX();
startY = e.getY();
}
@Override
public void mouseReleased(MouseEvent e ) {
endX = e.getX();
endY = e.getY();
}
};
MouseMotionListener mml = new MouseMotionListener(){
@Override
public void mouseDragged(MouseEvent e ) {
flag = 2;
x = e.getX();
y = e.getY();
frame.repaint();
}
@Override
public void mouseMoved(MouseEvent e ) {
flag = 1;
x = e.getX();
y = e.getY();
frame.repaint();
}
};
public void show(){
frame.setVisible( true );
}
public static void main( String[] args ){
new MouseListenersDemo1().show();
}
}
这里是重写update 和 paint(),通过调用repaint() 来 调用这两个方法,但却似乎毫无作用。开始我觉得应该可以,为什么呢?因为 repaint () 可以控制 update() 和 paint() 环。update() 方法clear component 并且调用paint(),而 paint() 方法则会调用 paintBorder() 、paintComponent() 、paintChildren()等。按道理来说我在 其它的方法中调用 repaint() 方法应该是可以的,但为什么不可以呢?
之后我把 update ()方法中的代码 ctrl+x,ctrl+v 到paint()方法中,程序却运行正常。说明现在的 update()并不起作用。把粘贴来的代码改成 super.paint( g ) 程序运行一样,说明 super.paint( g ) 的功能就是刷新画布与 clear 方法一样的功能。
最后
以上就是生动小伙为你收集整理的关于 Swing JFrame 的 update不起作用的全部内容,希望文章能够帮你解决关于 Swing JFrame 的 update不起作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复