可以掉落和滑动的星星

分两个类

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;
    }
}
时间: 2024-11-29 12:09:25

可以掉落和滑动的星星的相关文章

jQuery滑动星星评分效果

每日分享效果,今天分享一个jQuery滑动星星评分效果. jQuery星星评分制作5颗星星鼠标滑过评分打分效果,可取消评分结果,重新打分. HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" h

购物车星星评分

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>星星</title> 6 <script type="text/javascript"> 7 var ifping=false;//增加一个全局变量控制,让鼠标指向星星有滑动效果 8 window.onlo

swiper实现臭美app滑动效果

一.臭美app效果: 我的需求是这样,上面正常滑动,点击下面的小卡牌,上面的滑动区也随之切换到当前的点击态. 二.实现: css: 主要设置可见区域的几张卡牌的位置,注意的几个位置是,中间的激活态和左右两边的元素,swiper已经在运行的时候给他们加上了固定的类名. html: <!-- Swiper --> <div class="swiper-container"> <div class="swiper-wrapper"> &

仿开心消消乐 大树星星无限循环 点击(自定义view实现)

啥都不说先上效果图把.. 这个是我项目里的效果![这里写图片描述] 下面的是我抽取出来的 demo 适配啥的我基本上都做好了 没做其他的 ============================================================= 分割线 ================================================================== ok 下面 说一下思路把 首先 说一下原理 我是使用bitmap 创建两张图 一开始的时候 一张

ios开发——滑动星型评分控件的实现

在App Store或者其他一些应用中我们可以通过点击或滑动星星来给应用评分,效果图如下 现在我们来实现这一功能. 首先我们需要准备两张图片作为素材,一个是灰色背景星星,另一个是黄色星星表示评分.  (亮色星星)        (暗色星星) 实际操作中可以用自己需要的图片替代. 接着,我们建立自己的类继承View,来实现这个评分视图,这里假设起名为CYZStarRageView.现在来看一下头文件 @class CYZStarRateView; @protocol CYZStarRateView

ios 类似淘宝评论星星功能

创建星星视图: //星星 _myview = [[UIView alloc]initWithFrame:CGRectMake(95, 5, 200, 50)]; UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(huadong:)]; [_myview addGestureRecognizer:pan]; UITapGestureRecognizer

移动端tab滑动和上下拉刷新加载

移动端tab滑动和上下拉刷新加载 查看demo(请在移动端模式下查看) 查看代码 开发该插件的初衷是,在做一个项目时发现现在实现移动端tab滑动的插件大多基于swiper,swiper的功能太强大而我只要一个小小的tab滑动功能,就要引入200+k的js这未免太过浪费.而且swiper是没有下拉刷新功能的,要用swiper实现下拉刷新还得改造一番.在实现功能的同时产生了不少bug.要是在引入一个下拉刷新的插件又难免多了几十kb的js.而且这些插件对dom结构又是有一定要求的,一不小心就有bug.

干货--手把手撸vue移动UI框架: 滑动删除

前言 前几天因为项目需要,用jquery写了一个swiperOut组件,然后我就随便把这个组件翻译成基于Vue的了,有兴趣的朋友可以看下.Github源码(不麻烦的话帮忙start,请各位大爷赏个星星) demo展示 效果展示 老规矩,先上效果,效果不是很好,大家如果有什么生成gif的好用的软件可以推荐下: 开始制作 DOM结构 分析效果途中的结构,我们可以得出每一项可滑动删除的节点的结构包含如下两部分: 正文部分,显示咱们的主内容 滑动出来的部分(如:删除按钮) <li class="r

Android 监听ListView、GridView滑动到底部

// 监听listview滚到最底部mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (view.get