vi, Java, Ant, Junit自学报告 - 实训week1

时间:2023-03-09 16:57:15
vi, Java, Ant, Junit自学报告 - 实训week1

vi, Java, Ant, Junit自学报告

2017软件工程实训 15331023 陈康怡

vi

Vi是linux系统的标准文本编辑器,采用指令的方式进行操作,此处仅记录部分常用的指令。

vi模式

vi编辑器分为三种模式:

(1)命令行模式 command mode

命令行模式可控制光标移动,删除字符、字、行,复制剪切等操作。在命令行模式下按i进入插入模式,按:进入底行模式。

(2)插入模式 insert mode

在插入模式下,可以进行文字输入。在插入模式下,按Esc回到命令行模式。

(3)底行模式 last lint mode

主要进行保存退出的操作,也可以设置编辑环境。

vi基本操作

(1)打开文件

在Terminal中使用$ vi filename 即可用vi打开文件,若文件不存在,vi会自己创建新文件。

(2)退出vi

在底行模式中,输入:

:w filename ——将文本以文件名filename保存

:wq ——保存并退出vi

:q! ——不保存强制退出vi

命令行模式常用操作

(1)移动光标:

使用键盘上的h,j,k,l来分别控制光标向左,下,上,右移动。

(2)删除(可在操作前加数字表示删除多个):

x ——删除光标后的一个字符

X ——删除光标前的一个字符

dd ——删除光标所在行

(3)撤销:

u ——撤销上一次操作

底行模式常用操作

(1)列出行号 —— :set nu

(2)跳到某一行 —— :#

(3)保存 —— :w

Java

本周主要学习了Java下简单GUI程序的编写。Java下GUI程序编写主要使用了java.awt以及jawax.swing的库。

java的GUI程序的基本思路是以JFrame对象为基础,加入不同的控件如JButton,JTextField等控件实现不同的交互功能及布局,再用java代码实现功能逻辑。

小任务:实现简单计算器

这是我在这周实训中写的简单计算器中的一些代码片段。这里结合代码记录学习所得。完整代码见学习记录末尾。

private JFrame myframe = new JFrame("Calculator");
private JButton plusButton = new JButton("+");
private JTextField equalText = new JTextField("=");

这一段是声明计算器中的框架以及控件。首先JFrame myframe = new JFrame("Calculator");声明了一个JFrame对象。JFrame对象是Java GUI编程中的基础。它生成了一个程序窗体,窗体名称叫Calculator,之后你可以往JFrame中添加控件。接下来声明了JButton对象和JTextField对象,用于生成计算器上不同操作的按钮,以及输入操作数、输出结果的文本框对象。

//省略了部分功能相似代码
protected void generateFrame() {
//设置窗体大小
myframe.setSize(500,200); //设置窗体布局
myframe.setLayout(new GridLayout(0,5)); //设置控件属性
equalText.setEditable(false);
equalText.setHorizontalAlignment(SwingConstants.CENTER); //将控件插入窗体
myframe.add(operand1); //将窗体设置为可见,且关闭窗体时退出进程
myframe.setVisible(true);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

声明完以后,我们就可以在generateFrame函数中对窗体进行进一步的操作。代码的功能具体见注释。

这里有意思的地方主要有设置窗体布局和设置控件属性。Java Swing提供了多种布局方法:

(1)FlowLayout:将控件逐个添加到窗口中,从左往右一字排开,直至没有空间剩余才换到下一行。

(2)BorderLayout:将界面分成5个区域,分别用BorderLayout的常量指定:

1.-PAGE_START

2.-PAGE_END

3.-LINE_START

4.-LINE_END

5.-CENTER

(3)BoxLayout:可以控制控件水平或竖直地插入窗体。

(4)CardLayout:每次仅显示一个控件,可切换显示。

(5)GridLayout:控件会自动排列成指定行列数,且每个控件大小相同。

(6)GridBagLayout:最复杂、功能最强大的布局,可以实现不规则的网格状布局。

详见:swing布局管理

Swing还提供了一些常用的布局用的静态常量,例如居中可以用SwingContants.CENTER,除此之外还有BOTTOM, EAST, WEST等可供使用,相当方便。详见:SwingContants

public void addListener() {
plusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
operator.setText("+");
}
});
equalButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String op1 = operand1.getText();
String op2 = operand2.getText();
String opt = operator.getText();
String formula = op1+opt+op2;
try {
result.setText(""+ jse.eval(formula));
} catch (ScriptException e1) {
// TODO Auto-generated catch block
logger.warning(e1.toString());;
}
}
});
}

这段代码的作用是给各个按钮加上监听器,当按钮被点击时,触发对应的函数。此处等于号的运算,我引用了Javascript引擎中的eval函数,可以对字符串直接运算得出结果,相当方便。缺点是有安全隐患。

ant

ant是一种类似与C++下的makefile类似的编译机制,通过ant可以清晰方便地定义依赖关系,方便编译且提高效率。跟makefile相同,已经编译且没有改变的文件,ant不会重复编译。

ant的语法

ant采用XML语法,类似于web中的HTML语言的标签,利用Eclipse,我们可以轻易地得到模板,并在模板上进行修改。这里主要记录几个常用的标签。

(1) <property name="xxx" value="yyy"/>

此处声明了属性,即可在后文中使用${xxx}来代替yyy,尤用于文件路径,避免了文件路径变动导致build.xml中多处改动的情况。

(2)<target name="secondstep" depends="firststep"></target>

target标签表示ant执行的步骤,target执行顺序由depends属性决定,当该target的depends属性指向的target都已经执行完毕后,才会执行。

(3)<javac srcdir="${src.path}" destdir = "${build.path}"></javac>

javac标签用于编译java文件。

(4)<java classname="test" classpath="${build.path}"></java>

java标签用于执行class程序。

(5)<junit printsummary="true"><test name="testTest"></test></junit>

junit标签用于在ant中执行junit单元检测,test标签为测试的名称。

更多ant标签及其属性详见:ant如何编译项目

junit

junit是java单元测试工具,其优势在于简化了单元测试的工作。这里记录一些在学习junit过程中学习的知识。

元数据:记录数据的数据。junit中常用的元数据有:

@Test:测试

@Before:使用了该元数据的方法在每个测试方法执行之前都要执行一次。

@After:使用了该元数据的方法在每个测试方法执行之后要执行一次。

@Test(timeout=xxx):该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。

@ignore:该元数据标记的测试方法在测试中会被忽略。

重要函数:assertEquals(aaa, bbb) ——junit会对assertEquals中的aaa和bbb进行判断,若不相等则会返回failure。这是重要的测试函数。


以上就是第一周的学习记录。

下附Java GUI部分Calculator的完整代码。


import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Logger; public final class Calculator {
private Calculator(){} public static void main (String args[]) {
CalFrame myFrame = new CalFrame();
myFrame.generateFrame();
myFrame.addListener();
}
} class CalFrame {
CalFrame() {} private JFrame myframe = new JFrame("Calculator");
private static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
private static String strClassName = CalFrame.class.getName();
private static Logger logger = Logger.getLogger(strClassName);
private JButton plusButton = new JButton("+");
private JButton minusButton = new JButton("-");
private JButton multiplyButton = new JButton("*");
private JButton divideButton = new JButton("/");
private JButton equalButton = new JButton("=");
private JTextField equalText = new JTextField("=");
private JTextField operand1 = new JTextField("");
private JTextField operand2 = new JTextField("");
private JTextField operator = new JTextField("");
private JTextField result = new JTextField("");
protected void generateFrame() {
myframe.setSize(500,200);
//layout setting
myframe.setLayout(new GridLayout(0,5));
//other settings
equalText.setEditable(false);
operator.setEditable(false);
result.setEditable(false);
equalText.setHorizontalAlignment(SwingConstants.CENTER);
operand1.setHorizontalAlignment(SwingConstants.CENTER);
operand2.setHorizontalAlignment(SwingConstants.CENTER);
operator.setHorizontalAlignment(SwingConstants.CENTER);
result.setHorizontalAlignment(SwingConstants.CENTER);
//add listeners //add component
myframe.add(operand1);
myframe.add(operator);
myframe.add(operand2);
myframe.add(equalText);
myframe.add(result);
myframe.add(plusButton);
myframe.add(minusButton);
myframe.add(multiplyButton);
myframe.add(divideButton);
myframe.add(equalButton);
//visible setting
myframe.setVisible(true);
myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void addListener() {
plusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
operator.setText("+");
}
});
minusButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
operator.setText("-");
}
});
multiplyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
operator.setText("*");
}
});
divideButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
operator.setText("/");
}
});
equalButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String op1 = operand1.getText();
String op2 = operand2.getText();
String opt = operator.getText();
String formula = op1+opt+op2;
try {
result.setText(""+ jse.eval(formula));
} catch (ScriptException e1) {
// TODO Auto-generated catch block
logger.warning(e1.toString());;
}
}
});
}
}