【Java用法】一个Java小程序玩法哦

简介: 【Java用法】一个Java小程序玩法哦

多进程与多线程的区别?本质的区别在于每个进程拥有自己的一整套变量,而线程则共享数据。共享变量使线程之间的通信比进程之间的通信更有效、更容易。

此外,在有些操作系统中,与进程相比较,线程更“轻量级”,创建、撤销一个线程比启动新进程的开销要小得多。

这里从察看一个没有使用多线程的程序开始。用户很难让它执行多个任务。在对其进行剖析之后,将展示让这个程序运行几个彼此独立的多个线程是很容易的。这个程序采用不断地移动位置的方式实现球跳动的动画效果, 如果发现球碰到墙壁, 将进行重绘(见下图所示 )。

当点击开始按钮时, 程序将从屏幕的左上角弹出一个球, 这个球便开始弹跳。开始按钮的处理程序将调用 addBall 方法。这个方法循环运行 1000 次 move。 每调用一次 move,球就会移动一点, 当碰到墙壁时, 球将调整方向,并重新绘制面板。

如果运行这个程序, 球就会自如地来回弹跳, 但是, 这个程序完全控制了整个应用程序。如果你在球完成 1000 次弹跳之前已经感到厌倦了,并点击 关闭 按钮会发现球仍然还在弹跳。在球自己结束弹跳之前无法与程序进行交互。

显然,这个程序的性能相当糟糕。人们肯定不愿意让程序用这种方式完成一个非常耗时的工作。 毕竟,当通过网络连接读取数据时, 阻塞其他任务是经常发生的, 有时确实想要中断读取操作。 例如,假设下载一幅大图片。当看到一部分图片后,决定不需要或不想再看剩余的部分了, 此时,肯定希望能够点击 Stop 按钮或 Back 按钮中断下载操作。下一节将介绍如何通过运行一个线程中的关键代码来保持用户对程序的控制权。

程序清单给出了这个程序的代码。可以直接使用的代码哦~~~

public class Bounce {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new BounceFrame1();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}
/**
 * 拥有小球组件和按钮的框架
 */
class BounceFrame1 extends JFrame {
    private BallComponent component;
    public static final int STEPS = 1000;
    public static final int DELAY = 3;
    /**
     * Constructs the frame with the component for showing the bouncing ball and “开始” and “关闭” buttons
     */
    public BounceFrame1() {
        setTitle("Bounce");
        component = new BallComponent();
        add(component, BorderLayout.CENTER);
        JPanel buttonPanel = new JPanel();
        addButton(buttonPanel, "开始", event -> addBall());
        addButton(buttonPanel, "关闭", event -> System.exit(0));
        add(buttonPanel, BorderLayout.SOUTH);
        pack();
    }
    /**
     * 向容器中添加一个按钮
     *
     * @param c        容器
     * @param title    按钮标题
     * @param listener 按钮监听事件
     */
    public void addButton(Container c, String title, ActionListener listener) {
        JButton button = new JButton(title);
        c.add(button);
        button.addActionListener(listener);
    }
    public void addBall() {
        try {
            Ball ball = new Ball();
            component.add(ball);
            for (int i = 1; i <= STEPS; i++) {
                ball.move(component.getBounds());
                component.paint(component.getGraphics());
                Thread.sleep(DELAY);
            }
        } catch (Exception e) {
            System.out.println("出错啦~~~~");
        }
    }
}
/**
 * 画小球的组件
 */
class BallComponent extends JPanel {
    private static final int DEFAULT_WIDTH = 450;
    public static final int DEFAULT_HEIGHT = 350;
    List<Ball> balls = new ArrayList<>();
    /**
     * 向组件中添加小球
     *
     * @param ball 小球
     */
    public void add(Ball ball) {
        balls.add(ball);
    }
    @Override
    public void paintComponent(Graphics graphics) {
        // erase background
        super.paintComponent(graphics);
        Graphics2D g2 = (Graphics2D) graphics;
        for (Ball ball : balls) {
            g2.fill(ball.getShape());
        }
    }
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}
/**
 * A ball that moves and bounces off the edges of a rectangle
 */
class Ball {
    public static final int XSIZE = 15;
    public static final int YSIZE = 15;
    private double x = 0;
    private double y = 0;
    private double dx = 1;
    private double dy = 1;
    /**
     * Moves the ball to the next position, reversing direction if it hits one of the edges
     *
     * @param bounds
     */
    public void move(Rectangle2D bounds) {
        x += dx;
        y += dy;
        if (x < bounds.getMinX()) {
            x = bounds.getMinX();
            dx = -dx;
        }
        if (x + XSIZE >= bounds.getMaxX()) {
            x = bounds.getMaxX() - XSIZE;
            dx = -dx;
        }
        if (y < bounds.getMinY()) {
            y = bounds.getMinY();
            dy = -dy;
        }
        if (y + YSIZE >= bounds.getMaxY()) {
            y = bounds.getMaxY() - YSIZE;
            dy = -dy;
        }
    }
    /**
     * Gets ths shape of the ball at its current position
     *
     * @return
     */
    public Ellipse2D getShape() {
        return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
    }
}

 

完结!


相关文章
|
19天前
|
Java
Java中的抽象类:深入了解抽象类的概念和用法
Java中的抽象类是一种不能实例化的特殊类,常作为其他类的父类模板,定义子类行为和属性。抽象类包含抽象方法(无实现)和非抽象方法。定义抽象类用`abstract`关键字,子类继承并实现抽象方法。抽象类适用于定义通用模板、复用代码和强制子类实现特定方法。优点是提供抽象模板和代码复用,缺点是限制继承灵活性和增加类复杂性。与接口相比,抽象类可包含成员变量和单继承。使用时注意设计合理的抽象类结构,谨慎使用抽象方法,并遵循命名规范。抽象类是提高代码质量的重要工具。
33 1
|
1月前
|
前端开发 Java
java中的Queue队列的用法
java中的Queue队列的用法
19 1
|
1月前
|
XML Java 编译器
java aspectjrt AOP 用法
java aspectjrt AOP 用法
21 0
|
1月前
|
小程序 前端开发 JavaScript
基于Java的校园二手交易小程序的设计与实现
基于Java的校园二手交易小程序的设计与实现
27 2
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
8天前
|
JSON Java 数据格式
Java QueryWrapper基本用法
Java QueryWrapper基本用法
13 2
|
15天前
|
Java
Java 16 新玩法:instanceof 升级版,让类型检查更精准
Java 16 新玩法:instanceof 升级版,让类型检查更精准
13 0
|
20天前
|
人工智能 小程序 Java
Java智慧校园系统源码 微信小程序+电子班牌
通过设备管理对百纳智慧校园的智慧班牌以及百纳智慧屏(校牌)进行统一集中式管理,支持浏览所有设备的基本信息以及在离线状态,支持添加设备、设备一键开关机、一键重启、设置节假日开关机时间、设置日常开关机时间、远程班牌截屏、远程班牌升级等操作。
|
1月前
|
存储 小程序 前端开发
Java代码能搭建小程序
Java代码能搭建小程序
19 0