JAVA模仿屏保

这也是以前写的一个东西,全屏下运行,很像是WINDOWS下的屏保,会显示时钟,并且会随机自然地碰撞.全屏状态下如需退出,请按小键盘上的0退出.
点击下载可执行的JAR文件,JDK1.5以上
import  java.text. * ;
import  java.awt. * ;
import  javax.swing. * ;
import  java.awt.geom. * ;
import  java.util. * ;
import  java.awt.event. * ;
/*
 * ScreenTest.java
 *
 * Created on 2006年7月6日, 下午5:23
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

/**
 *
 * 
@author  lbf
 
*/
public   class  ScreenTest  extends  JPanel  implements  Runnable{
    
    
/**  Creates a new instance of ScreenTest  */
    
private  String time;
    
private  Rectangle2D rd;
    
private   int  x,y,a,b; // 座标值和方向值
     private   int  rgb = 0 ; // 颜色的值
     private  Color color; // 字体的颜色
     private   int  width,height; // 屏幕的大小
     public  ScreenTest( int  width, int  height) {
        
this .width = width;
        
this .height = height;
        initWindow();
    }
    
private   void  initWindow(){
        x
= ( int )(Math.random() * 300 );
        y
= ( int )(Math.random() * 500 );
        a
= 1 ;
        b
= 1 ;
        
this .setBackground(Color.BLACK);
        
this .setOpaque( true );
        rd
= new  Rectangle2D.Double( 10 , 10 , 101 , 10 );
        color
= Color.YELLOW;
    }
    
private   void  doColor(){
       rgb
= ( int )(Math.random() * 0xFFFFFF );
           color
= new  Color(rgb);
     }
    
public   void  paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.fillRect(
0 , 0 ,width,height);
        g.setColor(color);
        g.setFont(
new  Font( " 楷书 " ,Font.BOLD, 150 ));
        FontMetrics fm
= g.getFontMetrics();
        rd
= fm.getStringBounds(time,g);
        g.drawString(time,x,(
int )(y + rd.getHeight()));
      }
    
private   void  doTime(){
        Calendar cal
= Calendar.getInstance();
        DateFormat df
= DateFormat.getTimeInstance(DateFormat.MEDIUM);
        Date date
= cal.getTime();
        time
= df.format(date);
        x
+= a;
        y
+= b;
        
double  width1 = rd.getWidth();
        
double  height1 = rd.getHeight();
        rd.setRect(x,y,width1,height1);
        
if (rd.intersectsLine(width, 0 ,width,height)){
            doColor();
            a
=- 1 ;
        }
        
else   if (rd.intersectsLine( 0 , 0 , 0 ,height)){
            doColor();
            a
= 1 ;
        }
        
else   if (rd.getY() <=- 80 ){
             doColor();
             b
= 1 ;
        }
        
else   if (rd.intersectsLine( 0 ,height,width,height)){
           doColor();
            b
=- 1 ;
        }
        
    }
    
public   void  run(){
        
while ( true ){
            
try {
                Thread.sleep(
2 );
                doTime();
                repaint();
            }
            
catch (InterruptedException ie){
                ie.printStackTrace();
            }
        }
    }
   
public    static   void  main(String arsg[]){
        
        GraphicsDevice gd
= GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        DisplayMode dm
= gd.getDisplayMode();
        
int  width = dm.getWidth();
        
int  height = dm.getHeight();
        System.out.println(
" width= " + width + " \nheight= " + height);
        ScreenTest st
= new  ScreenTest(width,height);
        
final  JFrame jf = new  JFrame();
        jf.getContentPane().add(st,BorderLayout.CENTER);
        jf.setUndecorated(
true );
        gd.setFullScreenWindow(jf);
        
new  Thread(st).start();
        jf.addKeyListener(
new  KeyAdapter(){
           
public   void  keyReleased(KeyEvent ke){
               
if (ke.getKeyCode() == KeyEvent.VK_NUMPAD0)
                   System.exit(
0 );
                } 
        });
    }
    
}
Java 中编写自定义图片的屏幕保护程序可以通过以下步骤实现: 1.创建一个 Java 项目,并导入相关的库。 2.创建一个继承 JComponent 的类,用于显示图片。在该类中,重写 paintComponent() 方法,在其中绘制图片。 3.创建一个继承 JFrame 的类,用于显示屏保窗口。在该类中,设置窗口大小、位置以及其他相关属性。然后,将上一步中创建的 JComponent 子类添加到窗口中。 4.创建一个继承 Thread 的类,用于定时更新屏保窗口中显示的图片。在该类中,使用 Thread.sleep() 方法实现定时更新,并在每次更新时重新绘制 JComponent 子类中的图片。 5.创建一个继承 ScreenSaver 类的类,用于启动屏保程序。在该类中,实例化上一步中创建的 JFrame 子类,并启动定时更新图片的线程。 下面是示例代码: ``` import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import javax.swing.JComponent; import javax.swing.JFrame; public class MyImageComponent extends JComponent { private Image image; public MyImageComponent(String imagePath) { image = Toolkit.getDefaultToolkit().getImage(imagePath); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, getWidth(), getHeight(), this); } } public class MyScreenSaverFrame extends JFrame { public MyScreenSaverFrame() { setSize(500, 500); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyImageComponent imageComponent = new MyImageComponent("image.jpg"); add(imageComponent); } } public class MyScreenSaverThread extends Thread { private MyImageComponent imageComponent; public MyScreenSaverThread(MyImageComponent imageComponent) { this.imageComponent = imageComponent; } @Override public void run() { try { while (true) { Thread.sleep(5000); imageComponent.repaint(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class MyScreenSaver extends ScreenSaver { public static void main(String[] args) { MyScreenSaverFrame frame = new MyScreenSaverFrame(); frame.setVisible(true); MyScreenSaverThread thread = new MyScreenSaverThread((MyImageComponent)frame.getContentPane().getComponent(0)); thread.start(); } } ``` 在上面的代码中,MyImageComponent 类继承了 JComponent,用于显示图片。MyScreenSaverFrame 类继承了 JFrame,用于显示屏保窗口。MyScreenSaverThread 类继承了 Thread,用于定时更新图片。MyScreenSaver 类继承了 ScreenSaver,用于启动屏保程序。 在 MyScreenSaverFrame 类的构造方法中,设置了窗口大小、位置以及其他相关属性,并将 MyImageComponent 对象添加到窗口中。 在 MyScreenSaverThread 类中,使用 Thread.sleep() 方法实现定时更新,并在每次更新时重新绘制 MyImageComponent 中的图片。 在 MyScreenSaver 类中,实例化了 MyScreenSaverFrame 对象,并启动了 MyScreenSaverThread 线程。在启动线程时,通过 getContentPane() 方法获取到窗口中的 MyImageComponent 对象,并将其传递给 MyScreenSaverThread 构造方法中。这样,在定时更新时,就可以重新绘制 MyImageComponent 中的图片了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值