可以掉落和滑动的星星

分两个类

1.主类,在于设计主界面和一部分事件监听MyBall.java(没有导包)

public class MyBall extends JFrame {
    public static boolean isDown;
    public static int number_star = 0;// (1)
    private static final long serialVersionUID = 1L;
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
    JMenuBar menubar = new JMenuBar();
    JLabel menu;
    JRadioButton rdbtnSlop, rdbtnDown;
    JTextField txtNumber;
    ButtonGroup btngp;
    JLabel label;
    JButton btnAlert;

    public MyBall() {
        super("流星==漫天雪");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
    }

    private void init() {
        this.getContentPane().setBackground(Color.black);
        this.setSize(screen);
        menu = new JLabel("样式:");
        rdbtnSlop = new JRadioButton("斜线流星型");
        rdbtnDown = new JRadioButton("下落型");
        txtNumber = new JTextField("请输入星星的个数~~~回车");
        label = new JLabel("修改星星个数: ");
        rdbtnSlop.setSelected(true);
        btnAlert = new JButton("提示");
        btnAlert.setBackground(Color.orange);
        btnAlert.setToolTipText("请在1-201范围内变化");
        btngp = new ButtonGroup();
        this.setJMenuBar(menubar);
        menubar.add(menu);
        btngp.add(rdbtnSlop);
        btngp.add(rdbtnDown);
        menubar.add(rdbtnSlop);
        menubar.add(rdbtnDown);
        menubar.add(Box.createHorizontalStrut(20));
        menubar.add(label);
        menubar.add(txtNumber);
        menubar.add(btnAlert);
        btnAlert.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "只能输入1-201的数字作为星星的个数,否则会出错","小提示",JOptionPane.WARNING_MESSAGE);
            }
        });
        rdbtnDown.addMouseListener(new MouseAdapter() {// 鼠标点击下落型
                    public void mouseClicked(MouseEvent e) {
                        isDown = true;
                    }
                });
        rdbtnSlop.addMouseListener(new MouseAdapter() {// 鼠标点击斜向流线型
                    public void mouseClicked(MouseEvent e) {
                        isDown = false;
                    }
                });

        txtNumber.addKeyListener(new KeyAdapter() {// 键盘回车得到星星个数
                    public void keyPressed(KeyEvent e) {
                        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                            int number = Integer.parseInt(txtNumber.getText()
                                    .trim());// (2)
                            if (number > 0 && number < 202)
                                number_star = number;
                            else
                                JOptionPane.showMessageDialog(null,
                                        "请输入1-201中其中一个数字作为星星个数");
                        }
                    }
                });

        txtNumber.addFocusListener(new FocusAdapter() {// 星星个数文本框获得和释放焦点
                    public void focusGained(FocusEvent e) {
                        txtNumber.setText("");
                    }

                    public void focusLost(FocusEvent e) {
                        txtNumber.setText("请输入星星的个数~~~回车");
                    }
                });
    }

    public static void main(String[] args) {
        MyBall ball = new MyBall();
        FromMyPanel mp;
        mp = new FromMyPanel();
        ball.add(mp);
        Thread th = new Thread(mp);
        th.start();
        ball.setVisible(true);
    }
}

2.想界面填充星星和月亮以及对星星运用多线程FromMyPanel.java

class FromMyPanel extends Panel implements Runnable {
    private static final long serialVersionUID = 1L;
    private static int N = 101;// 星星的个数//(3)
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
    Random rand = new Random();
    int x[] = new int[201];// (4)
    int y[] = new int[201];// (5)
    int r, gg, b;// 星星的颜色中红、绿、蓝的分量

    public FromMyPanel() {
        for (int i = 0; i < this.getN(); i++) {// (6)
            x[i] = rand.nextInt((int) screen.getWidth());
            y[i] = rand.nextInt((int) screen.getHeight());
        }

    }

    public void paint(Graphics g) {
        g.setColor(Color.white);// 月亮
        g.fillOval(900, 50, 100, 100);
        g.setColor(Color.black);
        g.fillOval(880, 30, 100, 100);
        g.setFont(new Font("", 0, 35));
        r = rand.nextInt(255);
        gg = rand.nextInt(255);
        b = rand.nextInt(255);
        g.setColor(new Color(r, gg, b));// 星星的颜色
        // g.setColor(Color.white);
        try {
            for (int i = 0; i < this.getN(); i++) {// (7)
                g.drawString("*", x[i], y[i]);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }

    public void run() {
        while (true) {
            for (int i = 0; i < this.getN(); i++) {// (8)
                // 斜着滑动,如果想看向下方向的滑动请注释掉下面代码
                if (!MyBall.isDown) {
                    if (i % 20 == 0) {// 只有下表为20的倍数的星星在移动,即0,20,40,60,80
                        x[i]++;// 右下方向滑动
                        y[i]++;
                        if (y[i] > (int) screen.getHeight()) {
                            y[i] = 0;
                        }
                        if (x[i] > (int) screen.getWidth()) {
                            x[i] = 0;
                        }
                    }
                }

                // 竖着滑动,如果想看斜向滑动,请注释掉上面的代码
                if (MyBall.isDown) {
                    if (i % 3 == 0)
                        y[i] += 10;
                    y[i] += 10;// 下滑
                    if (y[i] > (int) screen.getHeight()) {
                        y[i] = 40;
                    }
                    if (x[i] > (int) screen.getWidth()) {
                        x[i] = 10;
                    }
                }
            }
            try {
                Thread.sleep(30);
                repaint();
            } catch (InterruptedException e) {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }
        }
    }

    public int getN() {// 得到输入的星星个数,但是有一点,输入大于201的数会出错,关联代码为(1)-(8)
        return MyBall.number_star != 0 ? MyBall.number_star : N;
    }
}

 

posted @ 2015-06-18 17:29  jamsbwo  阅读(270)  评论(0编辑  收藏  举报
©2014 to