一、实验目的
- 了解和使用操作系统程序开发环境;
- 熟悉常用的功能菜单命令;
- 掌握图形化程序开发方法;
- 深入理解操作系统中的时钟中断的含义及其具体使用。
二、实验内容
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);
}
}
托盘图标自己在网上下载一个,然后在代码内自己设置路径。