1、计算器
开发一个开发一个加、减、乘、除四则运算器。用户界面如下图:
思路:
- 顶层容器JFrame使用GridLayout创建4行1列单元格,第1、2、4为文本框,分别用来显示两个运算数和运算结果,第3格为JPanel,其中包含加减乘除四个运算按钮。
- 使用匿名类分别为四个按钮增加
代码如下:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Calculator extends JFrame {
public Calculator() {
setTitle("计算器");
setLayout(new GridLayout(4, 1));
JTextField num1 = new JTextField(30);
JTextField num2 = new JTextField(30);
JTextField res = new JTextField(30);
JPanel panel = new JPanel(new FlowLayout());
JButton addOp = new JButton("+");
JButton subOp = new JButton("-");
JButton mulOp = new JButton("×");
JButton divOp = new JButton("÷");
panel.add(addOp);
panel.add(subOp);
panel.add(mulOp);
panel.add(divOp);
add(num1);
add(num2);
add(panel);
add(res);
// 加法事件
addOp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double x = Double.parseDouble(num1.getText());
double y = Double.parseDouble(num2.getText());
double z = x + y;
res.setText(Double.toString(z));
}
});
// 减法事件
subOp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double x = Double.parseDouble(num1.getText());
double y = Double.parseDouble(num2.getText());
double z = x - y;
res.setText(Double.toString(z));
}
});
// 乘法事件
mulOp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double x = Double.parseDouble(num1.getText());
double y = Double.parseDouble(num2.getText());
double z = x * y;
res.setText(Double.toString(z));
}
});
divOp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double x = Double.parseDouble(num1.getText());
double y = Double.parseDouble(num2.getText());
double z = x/y;
res.setText(Double.toString(z));
}
});
//窗口关闭事件
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setLocationRelativeTo(null);
pack();
}
public static void main(String[] args) {
Calculator c = new Calculator();
c.setVisible(true);
}
}
运行结果:
2、变脸
编写一个“变脸”程序,程序运行后出现一张笑脸,鼠标点击一次编程哭脸,再点击一次变成笑脸,依次轮换,效果如下:
思路:
- 利用Graphics进行绘图,需要用到drawOval()、drawArc()、和drawString(),参数b为true时画笑脸,参数b为false时画哭脸
- JFrame绑定鼠标点击事件mouseClicked(),每次点击时将b取反,然后进行repaint()
代码:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class FaceChange extends JFrame {
public static boolean b = true;
public FaceChange() {
setTitle("变脸");
setBounds(400, 300, 300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
b = !b;
repaint();
}
});
}
public void paint(Graphics g) {
g.setColor(Color.blue);
if (b) {
super.paint(g); //加上super.paint(g)重绘时,会将原有的绘制清空,再根据paing(g)函数绘制
g.drawOval(100, 100, 100, 110);
g.drawArc(120, 130, 18, 12, 180, 180);
g.drawArc(160, 130, 18, 12, 180, 180);
g.drawArc(130, 160, 38, 19, 180, 180);
g.drawString("笑!", 70, 80);
} else {
super.paint(g);
g.drawOval(100, 100, 100, 110);
g.drawArc(120, 130, 18, 12, 180, -180);
g.drawArc(160, 130, 18, 12, 180, -180);
g.drawArc(130, 160, 38, 19, 180, -180);
g.drawString("哭!", 70, 70);
}
}
public static void main(String[] args) {
FaceChange demo = new FaceChange();
demo.setVisible(true);
}
}
运行结果:
3、标签移动
编写一个图形用户界面程序,窗体的宽度300,高度150,布局管理器为null,窗体上有二个标签和二个按钮,标签的位置为(10,30)和(200,60),按钮的位置为(50,100)和(150,100),它们的宽度和高度都是80和20。编写一个线程,该线程可以让标签向右或向左移动10次,每次移动10个单位,间隔1秒,通过按钮的动作事件启动上述线程,“向右走”按钮启动“向右移标签”,“向左走”按钮启动“向左移标签”,界面如下图所示。
思路:
- 图形界面使用继承JFrame的方式,多线程使用实现Runnable接口的方式
- 构造函数重载,无参数的用来创建主线程,单参数的用来创建子线程,且参数b用来设置左/右移
- run()方法使用参数b来判断左/右移,使用getX()、getY()、和setLocation()方法来实现移动
- 两个按键事件分别创建并启动子线程
- 注意要使用sleep()就一定要放在try…catch…中
代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MoveLabel extends JFrame implements Runnable {
private static boolean b;
static JLabel rlabel, llabel;
static JButton rbutton, lbutton;
public MoveLabel() {
}
public MoveLabel(boolean bb) {
b = bb;
}
public void FrameLanch() {
this.setTitle("Move Label");
this.setLayout(null);
setBounds(800, 400, 300, 200);
rlabel = new JLabel("向右移标签");
llabel = new JLabel("向左移标签");
rlabel.setBounds(10, 30, 80, 20);
llabel.setBounds(200, 60, 80, 20);
rbutton = new JButton("向右走");
lbutton = new JButton("向左走");
rbutton.setBounds(50, 100, 80, 20);
lbutton.setBounds(150, 100, 80, 20);
this.add(rlabel);
this.add(llabel);
this.add(rbutton);
this.add(lbutton);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
rbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new MoveLabel(true)).start();
}
});
lbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Thread(new MoveLabel(false)).start();
}
});
}
public void run() {
if (b) {
// 向右移
try {
for (int i = 0; i < 10; i++) {
rlabel.setLocation(rlabel.getX() + 10, rlabel.getY());
Thread.sleep(1000);
}
} catch (Exception e) {
System.out.println(e);
}
} else {
// 向左移
try {
for (int i = 0; i < 10; i++) {
llabel.setLocation(llabel.getX() - 10, llabel.getY());
Thread.sleep(1000);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
public static void main(String[] args) {
MoveLabel frame = new MoveLabel();
frame.FrameLanch();
}
}
运行结果: