Java复习——编程练习

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();
	}
}

运行结果:
在这里插入图片描述

发布了42 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42181428/article/details/103827180