首页 > 编程语言 > 详细

java写的比较炫酷的屏保(从csdn转载)

时间:2019-12-20 15:04:33      阅读:93      评论:0      收藏:0      [点我收藏+]
 
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
@SuppressWarnings("serial")
//JDialog类时创建对话框的主要类
public final class BinaryRain extends JDialog {
    public static void main(String[] args) {
        BinaryRain r = new BinaryRain();
        r.setVisible(true);
        r.start();
    }
    private BinaryRain() {
        try {
            initProperties();
            init();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Failed to init.\n" + ex, "BinaryRain", JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
    }
    private Color getColor(String color) {
        if (color == null || color.isEmpty())
            return null;
        if (color.startsWith("#")) {
            int i = Integer.valueOf(color.substring(1), 16);
            return new Color(i);
        }
        if (color.matches("[\\d]+[\\p{Blank}]*,[\\p{Blank}]*[\\d]+[\\p{Blank}]*,[\\p{Blank}]*[\\d]+")) {
            String[] cs = color.split("[\\p{Blank}]*,[\\p{Blank}]*");
            if (cs.length != 3)
                return null;
            int r = Integer.valueOf(cs[0]);
            int g = Integer.valueOf(cs[1]);
            int b = Integer.valueOf(cs[2]);
            return new Color(r, g, b);
        }
        return null;
    }
    private void initProperties() throws Exception {
        Properties p = new Properties();
        File f = new File(System.getProperty("user.dir") + "/BinaryRainProperties.properties");
        boolean dw = true, dh = true, df = true, db = true, dc = true, dcf = true;
        if (f.exists() && f.isFile()) {
            p.load(new FileInputStream(f));
            String strFore = p.getProperty("foreground", "default").toLowerCase();
            if (!strFore.equals("default")) {
                df = false;
                foreground = getColor(strFore);
                if (foreground == null)
                    foreground = Color.getColor(strFore, Color.RED);
            }
            String strBack = p.getProperty("background", "default").toLowerCase();
            if (!strBack.equals("default")) {
                db = false;
                background = getColor(strBack);
                if (background == null)
                    background = Color.getColor(strBack, Color.RED);
            }
            size = new Dimension();
            String strW = p.getProperty("width", "default").toLowerCase();
            if (!strW.equals("default")) {
                dw = false;
                size.width = Integer.valueOf(strW);
            }
            String strH = p.getProperty("height", "default").toLowerCase();
            if (!strH.equals("default")) {
                dh = false;
                size.height = Integer.valueOf(strH);
            }
            String strC = p.getProperty("characters", "default");
            if (!strC.equalsIgnoreCase("default")) {
                dc = false;
                String[] cs = strC.split(",");
                RAIN_CHARACTERS = new char[cs.length];
                for (int i = 0, s = RAIN_CHARACTERS.length; i < s; i++) {
                    RAIN_CHARACTERS[i] = cs[i].charAt(0);
                }
            }
            String strCF = p.getProperty("colorful", "default");
            if (!strCF.equalsIgnoreCase("default")) {
                dcf = false;
                isColorful = Boolean.parseBoolean(strCF);
            }
            String strM = p.getProperty("music", "default");
            if (!strM.equalsIgnoreCase("default")) {
                File musicFile = new File(strM);
                if (musicFile.exists() && musicFile.isFile())
                    if ((music = Applet.newAudioClip(musicFile.toURI().toURL())) != null)
                        hasMusic = true;
            }
        }
        if (dw & dh)
            size = Toolkit.getDefaultToolkit().getScreenSize();
        else if (dw)
            size.width = Toolkit.getDefaultToolkit().getScreenSize().width;
        else if (dh)
            size.height = Toolkit.getDefaultToolkit().getScreenSize().height;
        if (df)
            foreground = Color.RED;
        if (db)
            background = Color.GREEN;
        if (dc) {
            RAIN_CHARACTERS = new char[126 - 33 + 1];
            for (int c = 0, i = 33, l = RAIN_CHARACTERS.length; c < l; c++, i++)
                RAIN_CHARACTERS[c] = (char) i;
        }
        if (dcf)
            isColorful = false;
    }
    private Dimension size;
    private Color foreground, background;
    public char[] RAIN_CHARACTERS;
    private boolean isColorful;
    private boolean hasMusic = false;
    private AudioClip music;
    private void init() {
        setAlwaysOnTop(true);
        setResizable(false);
        setUndecorated(true);
        setTitle("Binary Rain");
        BufferedImage cursor = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB_PRE);
        setCursor(Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(8, 8), "Disable Cursor"));
        setSize(size);
        setLocationRelativeTo(null);
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent event) {
                if ((event.isAltDown() && event.getKeyCode() == KeyEvent.VK_F4) || (event.getKeyCode() == KeyEvent.VK_ESCAPE)) {
                    setVisible(false);
                    System.exit(0);
                }
            }
        });
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent event) {
                if (!isRaining())
                    stop();
                System.exit(0);
            }
        });
        add(panel, BorderLayout.CENTER);
    }
    @Override
    public void setVisible(boolean flag) {
        super.setVisible(flag);
        if (!flag)
            stop();
    }
    private Font rainFont;
    {
      
            try {
    rainFont = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("RainFont.ttf")).deriveFont(Font.BOLD, 15.0f);
   } catch (FontFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    rainFont = new Font("arial", Font.BOLD, 15);
    e.printStackTrace();
   }
       
    }
    private synchronized void newRain() {
        Rain r = new Rain(getRandomLength(), (int) (Math.random() * size.width), (int) (Math.random() * -60 * 15), (int) (Math.random() * 8 + 2), (float) (Math.random() * 10 + 10));
        rains.add(r);
        new Thread(r).start();
    }
    @SuppressWarnings({ "rawtypes", "unchecked" })
 private ArrayList<Rain> rains = new ArrayList();
    public void start() {
        if (hasMusic)
            music.loop();
        for (int c = 0, s = 108; c < s; c++)
            newRain();
        isStart = true;
        for (Rain r : rains)
            new Thread(r).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (isStart)
                    panel.repaint();
            }
        }).start();
    }
    public Dimension getFrameSize() {
        return size;
    }
    public boolean isRaining() {
        return isStart;
    }
    public int getRandomLength() {
        return (int) (Math.random() * 40 + 10);
    }
    public String getRandomChar() {
        return String.valueOf(RAIN_CHARACTERS[(int) (Math.random() * RAIN_CHARACTERS.length)]);
    }
    private void stop() {
        isStart = false;
        if (hasMusic)
            music.stop();
    }
    private RainPanel panel = new RainPanel();
    private boolean isStart = false;
    private final class RainPanel extends JPanel {
        public RainPanel() {
        }
        @Override
        public void paint(Graphics g) {
            if (isStart) {
                BufferedImage img = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = (Graphics2D) img.getGraphics();
                g2.setColor(background);
                g2.fillRect(0, 0, size.width, size.height);
                g2.setColor(foreground);
                @SuppressWarnings("unchecked")
    Collection<Rain> collection = (Collection<Rain>) rains.clone();
                for (Iterator<Rain> it = collection.iterator(); it.hasNext();) {
                    Rain r = it.next();
                    if (r.isEnd()) {
                        rains.remove(r);
                        newRain();
                        continue;
                    }
                    if (isColorful) {
                        g2.setFont(rainFont.deriveFont(r.getSize()));
                        String[] ss = r.getRainChars();
                        int x = r.getX();
                        int y = r.getY() - ss.length * 15;
                        for (int i = 0, sss = ss.length; i < sss; i++) {
                            if (i < 7)
                                g2.setColor(COLORS[i]);
                            else
                                g2.setColor(COLORS[i % 7]);
                            g2.drawString(ss[i], x, y);
                            y += 15;
                        }
                    } else {
                        g2.setFont(rainFont.deriveFont(r.getSize()));
                        String[] ss = r.getRainChars();
                        int x = r.getX();
                        int y = r.getY() - ss.length * 15;
                        for (String s : ss) {
                            g2.drawString(s, x, y);
                            y += 15;
                        }
                    }
                }
                g.drawImage(img, 0, 0, this);
            }
        }
        private final Color[] COLORS = new Color[]{
            new Color(255, 0, 0),
            new Color(255, 165, 0),
            new Color(255, 255, 0),
            new Color(0, 255, 0),
            new Color(0, 127, 0),
            new Color(0, 127, 255),
            new Color(139, 0, 255),};
    }
    private final class Rain implements Runnable {
        public Rain(int length, int x, int y, int speed, float size) {
            if (speed < 1)
                throw new RuntimeException("The speed must be greater than or equal to 1.");
            if (length < 5)
                length = getRandomLength();
            if (size < 1.0f)
                size = 15.0f;
            rainChars = new String[length + 1];
            for (int i = 0; i < length; i++)
                rainChars[i] = getRandomChar();
            rainChars[length] = " ";
            this.rainX = x;
            this.rainY = y;
            this.rainSpeed = speed;
            this.fontSize = size;
        }
        @Override
        public void run() {
            while (isRaining() && rainY < getFrameSize().height + (rainChars.length + 1) * 15) {
                if (rainSpeed <= 0)
                    break;
                try {
                    Thread.sleep(rainSpeed);
                } catch (InterruptedException ex) {
                }
                rainY += 2;
            }
            rainSpeed = -1;
        }
        public String[] getRainChars() {
            return rainChars;
        }
        public int getX() {
            return rainX;
        }
        public int getY() {
            return rainY;
        }
        public float getSize() {
            return fontSize;
        }
        public boolean isEnd() {
            return rainSpeed <= 0;
        }
        private final String[] rainChars;
        private int rainSpeed;
        private int rainX, rainY;
        private float fontSize;
    }
}

java写的比较炫酷的屏保(从csdn转载)

原文:https://www.cnblogs.com/aiyouzi/p/12072810.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!