第四次实验
本次实验主要练习知识点是:
Java GUI组件的使用
布局的练习
按钮的监听事件
线程的定义与使用
1、简单的计算器
编写一个应用程序,利用两个文本框对象input1和input2,接收用户从键盘输入的两个整型数。当用户单击“计算”按钮时,可进行算术计算,并输出运算结果;运算结果放在多行文本域JTextArea组件中。编写一个应用程序,利用两个文本框对象input1和input2,接收用户从键盘输入的两个整型数。当用户单击“计算”按钮时,可进行算术计算,并输出运算结果;运算结果放在多行文本域JTextArea组件中。
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Main extends JFrame{
public static void main(String args[]) {
InitMain();
}
public static void InitMain() {
String[] fuhaos= {"+","-","*","/"};
Main mainFrame = new Main();
mainFrame.setBounds(800, 400, 450, 80);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setLayout(new FlowLayout());
JTextField input1 = new JTextField(6);
JTextField input2 = new JTextField(6);
JButton btn = new JButton("计算");
JComboBox<String> fuhao = new JComboBox<>(fuhaos);
JLabel equrt = new JLabel("=");
JTextArea result = new JTextArea(1, 4);
mainFrame.add(input1);
mainFrame.add(fuhao);
mainFrame.add(input2);
mainFrame.add(equrt);
mainFrame.add(result);
mainFrame.add(btn);
mainFrame.setVisible(true);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int temp = 0;
switch(fuhao.getSelectedItem().toString()) {
case "+":
try {
temp = Integer.valueOf(input1.getText())+Integer.valueOf(input2.getText());
result.setText(String.valueOf(temp));
}catch (Exception e1) {
result.setText("非法字符请重新输入");
}
break;
case "-":
try {
temp = Integer.valueOf(input1.getText())-Integer.valueOf(input2.getText());
result.setText(String.valueOf(temp));
}catch (Exception e1) {
result.setText("非法字符请重新输入");
}
break;
case "*":
try {
temp = Integer.valueOf(input1.getText())*Integer.valueOf(input2.getText());
result.setText(String.valueOf(temp));
}catch (Exception e1) {
result.setText("非法字符请重新输入");
}
break;
case "/":
try {
temp = Integer.valueOf(input1.getText())/Integer.valueOf(input2.getText());
result.setText(String.valueOf(temp));
}catch (Exception e1) {
result.setText("非法字符请重新输入");
}
break;
}
}
});
}
}
外观:
加法:
减法:
乘法:
除法:
错误输入示例:
输入含有字母:
除数为0:
改进:经过老师的提点,给出了一个大概的思路框架,特修改版本如下:
1、点击计算按钮,在文本区域里直接显示两个数的四则运算
2、点击计算按钮,在文本域里随机显示两个数的四则运算的其中一个
先上图:
代码如下:
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String args[]) {
new MyFrame("First",1);
new MyFrame("Second",2);
}
}
class MyFrame extends JFrame implements ActionListener{
JPanel mypanel,mypanel2;
JTextArea textArea;
JTextField input1,input2;
JLabel label1,label2;
JButton btn;
JScrollPane scroll;
int type = 0;
public MyFrame(String title,int type) {
this.type = type;
mypanel = new JPanel();
mypanel2 = new JPanel();
textArea = new JTextArea(7,21);
textArea.setFont(new Font("Serif",0,20));
input1 = new JTextField(6);
input2 = new JTextField(6);
label1 = new JLabel("input1:");
label2 = new JLabel("input2:");
label2.setBorder(new EmptyBorder(0, 20, 0, 0));
btn = new JButton("计算");
btn.addActionListener(this);
scroll = new JScrollPane(textArea);
mypanel.add(label1);
mypanel.add(input1);
mypanel.add(label2);
mypanel.add(input2);
mypanel.add(btn);
mypanel2.add(scroll);
setTitle(title);
if(type == 1)
setBounds(400, 200, 400, 300);
else
setBounds(820, 200, 400, 300);
add(mypanel,BorderLayout.NORTH);
add(mypanel2, BorderLayout.CENTER);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent event) {
int firNum,secNum;
try {
firNum = Integer.parseInt(input1.getText());
secNum = Integer.parseInt(input2.getText());
switch(type) {
case 1:
if(secNum != 0) {
textArea.append(firNum+"+"+secNum+"="+(firNum+secNum));
textArea.append("\t"+firNum+"-"+secNum+"="+(firNum-secNum)+"\n");
textArea.append(firNum+"*"+secNum+"="+(firNum*secNum));
textArea.append("\t"+firNum+"/"+secNum+"="+(firNum/secNum)+"\n");
}else {
textArea.append(firNum+"+"+secNum+"="+(firNum+secNum));
textArea.append("\t"+firNum+"-"+secNum+"="+(firNum-secNum)+"\n");
textArea.append(firNum+"*"+secNum+"="+(firNum*secNum));
textArea.append("\t除数为0\n");
}
break;
case 2:
int x=1+(int)(Math.random()*4);
switch(x) {
case 1:
textArea.append(firNum+"+"+secNum+"="+(firNum+secNum)+"\n");
break;
case 2:
textArea.append(firNum+"-"+secNum+"="+(firNum-secNum)+"\n");
break;
case 3:
textArea.append(firNum+"*"+secNum+"="+(firNum*secNum)+"\n");
break;
case 4:
if(secNum != 0) {
textArea.append(firNum+"/"+secNum+"="+(firNum/secNum)+"\n");
}else {
textArea.append("除数为0!\n");
}
break;
}
break;
}
}catch (Exception e) {
textArea.append("您的输入含有非数字类型,请重新输入!\n");
}
}
}
2、计算
编写一个应用程序,设计4个按钮,分别命名为“加”、“减”、“乘”、“除”,有3个文本框。单击相应的按钮,将两个文本框的数字做运算,在第三个文本框中显示结果。
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Main extends JFrame{
public static void main(String args[]) {
Initmain();
}
private static void Initmain() {
Main mainFrame = new Main();
mainFrame.setTitle("ALU");
mainFrame.setLayout(new FlowLayout());
JPanel mPanel = new JPanel();
mPanel.setLayout(new GridLayout(4,1));
JButton addBt = new JButton("加");
JButton decBt = new JButton("减");
JButton mulBt = new JButton("乘");
JButton divBt = new JButton("除");
mPanel.add(addBt);
mPanel.add(decBt);
mPanel.add(mulBt);
mPanel.add(divBt);
JLabel label1 = new JLabel("=");
JTextField input1 = new JTextField(4);
JTextField input2 = new JTextField(4);
JTextField output = new JTextField(4);
mainFrame.add(input1);
mainFrame.add(mPanel);
mainFrame.add(input2);
mainFrame.add(label1);
mainFrame.add(output);
mainFrame.setBounds(800, 400, 450, 160);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
addBt.addActionListener(new ActionListener() {
int temp;
@Override
public void actionPerformed(ActionEvent e) {
try {
temp = Integer.valueOf(input1.getText())+Integer.valueOf(input2.getText());
output.setText(String.valueOf(temp));
}catch (Exception e1) {
output.setText("错误!");
}
}
});
decBt.addActionListener(new ActionListener() {
int temp;
@Override
public void actionPerformed(ActionEvent e) {
try {
temp = Integer.valueOf(input1.getText())-Integer.valueOf(input2.getText());
output.setText(String.valueOf(temp));
}catch (Exception e1) {
output.setText("错误!");
}
}
});
mulBt.addActionListener(new ActionListener() {
int temp;
@Override
public void actionPerformed(ActionEvent e) {
try {
temp = Integer.valueOf(input1.getText())*Integer.valueOf(input2.getText());
output.setText(String.valueOf(temp));
}catch (Exception e1) {
output.setText("错误!");
}
}
});
divBt.addActionListener(new ActionListener() {
int temp;
@Override
public void actionPerformed(ActionEvent e) {
try {
temp = Integer.valueOf(input1.getText())/Integer.valueOf(input2.getText());
output.setText(String.valueOf(temp));
}catch (Exception e1) {
output.setText("错误!");
}
}
});
}
}
外观:
加法:
减法:
乘法:
除法:
错误输入示例:
经过老师上课演示的一个示例来看,我做的这个太low了,太丑的了,决心修改一番
在已有的功能基础上增加了错误时间的响应(弹出的提示框)
先上效果图:
上代码:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String args[]) {
new Myframe("Second");
}
}
class Myframe extends JFrame implements ActionListener{
JPanel mypanel,mypanel2;
JTextField input1,input2,output;
JButton addbtn,decbtn,mulbtn,divbtn;
JLabel label1,label2,label3;
public Myframe(String title){
mypanel = new JPanel();
mypanel2 =new JPanel();
input1 = new JTextField(6);
input2 = new JTextField(6);
output = new JTextField(6);
label1 = new JLabel("input1:");
label2 = new JLabel("input2:");
label2.setBorder(new EmptyBorder(0, 20, 0, 0));
label3 = new JLabel("result:");
label3.setBorder(new EmptyBorder(0, 20, 0, 0));
addbtn = new JButton("加");
decbtn = new JButton("减");
mulbtn = new JButton("乘");
divbtn = new JButton("除");
addbtn.addActionListener(this);
decbtn.addActionListener(this);
mulbtn.addActionListener(this);
divbtn.addActionListener(this);
mypanel.add(label1);
mypanel.add(input1);
mypanel.add(label2);
mypanel.add(input2);
mypanel.add(label3);
mypanel.add(output);
mypanel2.add(addbtn);
mypanel2.add(decbtn);
mypanel2.add(mulbtn);
mypanel2.add(divbtn);
add(mypanel);
add(mypanel2);
setTitle(title);
setBounds(400, 200, 460, 140);
setLayout(new GridLayout(2, 1));
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent event) {
int firNum,secNum;
if(input1.getText().equals("")||input2.getText().equals(""))
JOptionPane.showMessageDialog(null, "输入不能为空!", "错误", JOptionPane.ERROR_MESSAGE);
else
try {
firNum = Integer.parseInt(input1.getText());
secNum = Integer.parseInt(input2.getText());
if(event.getSource() == addbtn) {
output.setText(String.valueOf(firNum+secNum));
}else if(event.getSource() == decbtn) {
output.setText(String.valueOf(firNum-secNum));
}else if(event.getSource() == mulbtn) {
output.setText(String.valueOf(firNum*secNum));
}else if(event.getSource() == divbtn) {
if(secNum == 0) {
JOptionPane.showMessageDialog(null, "除数不能为0!", "错误", JOptionPane.ERROR_MESSAGE);
}else {
output.setText(String.valueOf(firNum/secNum));
}
}
}catch (Exception e) {
JOptionPane.showMessageDialog(null, "您的输入含有非法字符!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
}
3、线程的定义和使用
编写一个有两个线程的程序,第一个线程用来计算2~100000之间的质数及个数,第二个线程用来计算100000-200000之间的质数及个数。
public class Main {
public static void main(String args[]) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("2-100000之间的质数个数:"+fundSushu(2,100000));
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("100000-200000之间的质数个数:"+fundSushu(100000,200000));
}
});
thread1.start();
thread2.start();
}
public static int fundSushu(int start,int end) {
int count1 = 0, count2 = 0;
for (int i = start; i <= end; i++) {
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j != 0) {
count1++;
}
}
int num = (int) Math.sqrt(i);
if (count1 == (num - 1)) {
count2++;
}
count1 = 0;
}
return count2;
}
}