操作系统实验一 时钟中断程序设计用Java实现

一、实验目的

  1. 了解和使用操作系统程序开发环境
  2. 熟悉常用的功能菜单命令;
  3. 掌握图形化程序开发方法;
  4. 深入理解操作系统中的时钟中断的含义及其具体使用。

二、实验内容 

1、安装Linux虚拟机,熟悉Linux系统下各种操作命令,包括软件安装命令,程序编译运行命令等。

2、在屏幕指定窗口区域绘制一辆小车(或载入一幅小车图片,去掉背景),让小车沿窗口左上角往右下角匀速移动。

具体要求如下:

(1)小车一定要是从左上角到右下角;

(2)移动是基本匀速的,且能通过按钮调节其速度,速度设置至少在2种以上;

(3)点击关闭按钮后,程序转入后台执行,程序对应图标出现在任务栏托盘区;

(4)右键点击托盘区程序对应图标,弹出菜单,点击“恢复”,则程序重新被切换到前台运行,点击“退出”,程序退出内存,停止运行;

(5)程序转入后台运行时,小车仍然在移动。只是不可见而已。

四、实验要求

1、复习教材有关内容。

2、掌握VC控制台应用程序的开发、调试步骤。

3、完成实验报告。

下面奉上代码:

package text.MoveCar;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MoveCar extends JFrame {
    private int x = 0; // 小车的横坐标
    private int y = 0; // 小车的纵坐标
    private boolean isMoving = true; // 中断标志(小车是否在移动)
    private boolean isTrayIconAdded = false; // 托盘图标是否已经被添加
    int delayTime = 5; // 时延


    public MoveCar() {
        setTitle("Move Car"); // 设置窗口标题为 "Move Car"
        setSize(800, 800); // 设置窗口尺寸
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 当用户关闭窗口时,应用程序将会终止并退出
        setLocationRelativeTo(null); // 将窗口居中显示
        setResizable(false); // 设置窗口大小不可改变
        setLayout(new BorderLayout()); // 设置布局管理器为边界布局

        CarCanvas canvas = new CarCanvas();
        add(canvas, BorderLayout.CENTER);

        //在窗口添加中断按钮
        JButton interruptButton = new JButton("中断");
        interruptButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {   // 点击中断按钮后,停止移动
                if (getIsMoving())
                    setIsMoving(false);
            }
        });

        //在窗口添加恢复按钮
        JButton beginButton = new JButton("恢复");
        beginButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!getIsMoving()) {
                    setIsMoving(true);
                    canvas.repaint(); // 重新绘制小车的位置
                }
            }
        });

        //在窗口添加默认按钮
        JButton acquiesceButton = new JButton("默认");
        acquiesceButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setX(0);
                setY(0);
                if (!getIsMoving())
                    setIsMoving(true);
                delayTime = 5; //恢复默认速度
                }
        });

        //在窗口添加速度1按钮
        JButton speed1Button = new JButton("速度1");
        speed1Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                delayTime = 10; // 设置延时时间为300毫秒,即移动速度较慢
            }
        });

        //在窗口添加速度2按钮
        JButton speed2Button = new JButton("速度2");
        speed2Button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                delayTime = 2; // 设置延时时间为30毫秒,即移动速度较快
            }
        });

        // 创建退出按钮
        JButton exitButton = new JButton("退出");
        exitButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);  // 退出程序
            }
        });

        // 创建关闭按钮
        JButton closeButton = new JButton("关闭");
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setVisible(false); // 隐藏窗口
            }
        });

        //创建最小化按钮
        JButton minimizeButton = new JButton("最小化");
        minimizeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setState(JFrame.ICONIFIED); // 最小化窗口
            }
        });


        //创建一个面板,添加这些按钮依次排列
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(interruptButton);
        buttonPanel.add(beginButton);
        buttonPanel.add(acquiesceButton);
        buttonPanel.add(speed1Button);
        buttonPanel.add(speed2Button);
        buttonPanel.add(minimizeButton);
        buttonPanel.add(closeButton);
        buttonPanel.add(exitButton);

        //将他们放在窗口的下面
        add(buttonPanel, BorderLayout.SOUTH);

        // 检查系统是否支持托盘功能
        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("D:\\IDEAworkspace\\src\\text\\Window\\car.png"); // 替换为你的图标路径

            // 创建弹出菜单及其项
            PopupMenu popup = new PopupMenu();

            //恢复界面
            MenuItem restoreItem = new MenuItem("begin");
            restoreItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    setVisible(true);  // 显示窗口
                    setExtendedState(JFrame.NORMAL);  // 恢复窗口正常大小
                    toFront();  // 将窗口置于前台
                }
            });
            //退出程序
            MenuItem exitItem = new MenuItem("exit");
            exitItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);  // 退出程序
                }
            });

            //将这两个选项添加到菜单
            popup.add(restoreItem);
            popup.add(exitItem);

            // 设置托盘图标自动调整大小
            TrayIcon trayIcon = new TrayIcon(image, "Move Car", popup);
            trayIcon.setImageAutoSize(true);

            //防止重复添加托盘
            if (!isTrayIconAdded) {
                try {
                    tray.add(trayIcon);
                    isTrayIconAdded = true;  // 设置托盘图标已添加标志为true
                } catch (AWTException e) {
                    System.err.println("TrayIcon could not be added.");
                }
            }
       }

        setVisible(true); // 设置窗口可见

        //用于移动窗口画布上的元素的线程
        Thread moveThread = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(delayTime);  // 根据速度按钮设置的延时时间来控制移动速度
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (getIsMoving()) {
                    updateX(1);
                    updateY(1);
                    if (x >= 650 && y >= 650) {
                        x = 0;
                        y = 0;
                    }
                    canvas.repaint();  //重新绘制画布
                }
            }
        });
        moveThread.start();
    }



    public void updateX(int x) { // 更新x的位置
        this.x += x;
    }

    public void updateY(int y) { // 更新y的位置
        this.y += y;
    }

    public void setX(int x) {   //设置x的位置
        this.x = x;
    }

    public void setY(int y) {   //设置y的位置
        this.y = y;
    }

    public int getX() { // 获取x的位置
        return x;
    }

    public int getY() { // 获取y的位置
        return y;
    }

    public void setIsMoving(boolean isMoving) {
        this.isMoving = isMoving;
    }

    public boolean getIsMoving() {
        return isMoving;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(MoveCar::new);
    }
}

//在窗口绘画一个小汽车
class CarCanvas extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);  //调用父类的paintComponent(g)方法进行默认的绘制操作
        //获取到MoveCar窗口的横坐标和纵坐标,并将其保存在局部变量x和y中。
        MoveCar moveCar = (MoveCar) SwingUtilities.getWindowAncestor(this);
        int x = moveCar.getX();
        int y = moveCar.getY();

        g.setColor(Color.RED);
        g.fillRect(x, y, 100, 50);
        g.setColor(Color.BLACK);
        g.fillOval(x + 10, y + 40, 20, 20);
        g.fillOval(x + 70, y + 40, 20, 20);
    }
}

托盘图标自己在网上下载一个,然后在代码内自己设置路径。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值