package com;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
* 随机出题
* @author cyw
*
*/
@SuppressWarnings("serial")
public class Rdom extends JFrame{
Container c=getContentPane();
JPanel jp1,jp2,jp3,jp4,jp5,jp6,jp7;
Random r=new Random();
ButtonGroup bg=new ButtonGroup();
JTextField one,second,result;
JRadioButton jia,jian,cheng,chu;
JButton chuti,check,answer,alert,clear,Xd;
JLabel deng;
JLabel jiu=new JLabel();
JLabel x=new JLabel();
JTextArea jta=new JTextArea(8, 25);
JScrollPane js=new JScrollPane(jta);
int i=100;
int b=10;
//菜单栏
JMenuBar mb=new JMenuBar();
JMenu function=new JMenu("功能(G)");
JMenuItem clock=new JMenuItem("解锁");
JMenu introduce=new JMenu("说明(I)");
JMenuItem address=new JMenuItem("保存路径说明");
JMenuItem clockintroduce=new JMenuItem("“解锁”说明");
JMenuItem checkintroduce=new JMenuItem("“提交答案”说明");
JMenuItem chutiintroduce=new JMenuItem("“出题”说明");
JMenuItem answerintroduce=new JMenuItem("“查看答案”说明");
JMenuItem alertintroduce=new JMenuItem("“修改出题范围”说明");
JMenuItem clearintroduce=new JMenuItem("“清除”说明");
JMenuItem xdintroduce=new JMenuItem("“小数点位数”说明");
JMenu about=new JMenu("关于(E)");
JMenu editor=new JMenu("作者:CYW");
JTextField qq=new JTextField("QQ:756398953");
JTextField Wechat=new JTextField("微信:wave756398953");
JLabel e=new JLabel(" 作者:CYW");
int t=0;
public Rdom(String s){
super(s);
this.setBounds(500, 120, 303, 487);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
menu();
init();
images();
this.setVisible(true);
}
private void images() {
//创建图标
try {
this.setIconImage(ImageIO.read(new File("images\\1.jpg")));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
/**标题栏部署*/
private void menu() {
mb.add(function);
mb.add(introduce);
mb.add(about);
mb.add(e);
setJMenuBar(mb);
function.add(clock);
function.setMnemonic('G');
introduce.add(address);
introduce.setMnemonic('I');
address.setBackground(Color.red);
address.setForeground(Color.yellow);
introduce.add(clockintroduce);
introduce.addSeparator();
introduce.add(checkintroduce);
introduce.add(chutiintroduce);
introduce.add(answerintroduce);
introduce.add(alertintroduce);
introduce.add(clearintroduce);
introduce.add(xdintroduce);
about.add(editor);
about.setMnemonic('E');
editor.add(qq);
editor.addSeparator();
editor.add(Wechat);
qq.setEditable(false);
Wechat.setEditable(false);
qq.setBorder(BorderFactory.createEtchedBorder( Color.cyan, Color.pink));
Wechat.setBorder(BorderFactory.createEtchedBorder( Color.cyan, Color.pink));
qq.setBackground(Color.cyan);
Wechat.setBackground(Color.pink);
//添加监听器
MenuAction ma=new MenuAction();
clock.addActionListener(ma);
clockintroduce.addActionListener(ma);
address.addActionListener(ma);
checkintroduce.addActionListener(ma);
chutiintroduce.addActionListener(ma);
answerintroduce.addActionListener(ma);
alertintroduce.addActionListener(ma);
clearintroduce.addActionListener(ma);
xdintroduce.addActionListener(ma);
//作者标志通过线程修改颜色
color c=new color();
c.start();
}
/**界面部署*/
private void init() {
c.setLayout(null);//取消布局
jp1=new JPanel(new FlowLayout());
jp1.setBounds(20, 20, 250, 30);
jp2=new JPanel(new FlowLayout());
jp2.setBounds(20, 50, 250, 30);
jp3=new JPanel(new FlowLayout());
jp3.setBounds(20, 80, 250, 30);
jp4=new JPanel(new FlowLayout());
jp4.setBounds(20, 110, 250, 20);
jp5=new JPanel(new FlowLayout());
jp5.setBounds(20, 130, 250, 30);
jp6=new JPanel(new FlowLayout());
jp6.setBounds(0, 170, 300, 70);
jp7=new JPanel(new FlowLayout());
jp7.setBounds(0, 250, 300, 250);
one=new JTextField(12);
jia=new JRadioButton("+",true);
jian=new JRadioButton("-");
cheng=new JRadioButton("×");
chu=new JRadioButton("÷");
second=new JTextField(12);
deng=new JLabel("=");
result=new JTextField(12);
chuti=new JButton("出题");
check=new JButton("提交答案");
answer=new JButton("查看答案");
alert=new JButton("修改出题范围");
clear=new JButton("清除");
//按钮监听
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
one.setText("");
second.setText("");
result.setText("");
result.requestFocus();
}
});
Xd=new JButton("小数点位数");
Xd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int c=0;
while(c<=(b-1)){
c++;
}
String ab=c+"";
int a1=0;
while(a1<=(ab.length()-2)){
a1++;
}
Integer i=new Integer(JOptionPane.showInputDialog(null,"现小数点后保留"+a1+"位数,改为:","小数点",JOptionPane.PLAIN_MESSAGE));
x.setText("1");
for(int j=0;j<=(i-1);j++){
String a="0";
x.setText(x.getText()+a);
}
Integer i1=new Integer(x.getText());
b=i1;
String ac=b+"";
int a2=0;
while(a2<=(ac.length()-2)){
a2++;
}
jta.setText(jta.getText()+"\n已改为小数点后保留"+a2+"位小数:");
} catch (NumberFormatException e2) {
}
result.requestFocus();
if(b==1)
i=i+1;
else
i=i-1;
}
});
jp1.add(one);
jp2.add(jia);
jp2.add(jian);
jp2.add(cheng);
jp2.add(chu);
jp3.add(second);
jp4.add(deng);
jp5.add(result);
bg.add(jia);
bg.add(jian);
bg.add(cheng);
bg.add(chu);
c.add(jp1);
c.add(jp2);
c.add(jp3);
c.add(jp4);
c.add(jp5);
c.add(jp6);
jp6.add(check);
jp6.add(chuti);
jp6.add(answer);
jp6.add(alert);
jp6.add(clear);
jp6.add(Xd);
check.addActionListener(new A());
answer.addActionListener(new A());
chuti.addActionListener(new B());
alert.addActionListener(new B());
one.addKeyListener(new key());
second.addKeyListener(new key());
result.addKeyListener(new key());
one.setHorizontalAlignment(JTextField.CENTER);
second.setHorizontalAlignment(JTextField.CENTER);
result.setHorizontalAlignment(JTextField.CENTER);
B b=new B();
one.addActionListener(b);
second.addActionListener(b);
jia.addActionListener(b);
jian.addActionListener(b);
cheng.addActionListener(b);
chu.addActionListener(b);
jp7.add(js);
c.add(jp7);
one.setEditable(false);
second.setEditable(false);
jta.setEditable(false);
jta.setBorder(BorderFactory.createTitledBorder("出题记录文本域"));
addWindowListener(new C());
}
class A implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==check){
if(result.getText().equals("")){
JOptionPane.showMessageDialog(null, "请输入答案");
}else{
double re=Double.parseDouble(result.getText());
double o=Double.parseDouble(one.getText());
double s=Double.parseDouble(second.getText());
BigDecimal i= new BigDecimal(Double.toString(o));//使小数点运算更精密
BigDecimal j= new BigDecimal(Double.toString(s));//使小数点运算更精密
double res=0;
if(jia.isSelected()){
res=i.add(j).doubleValue();
}
if(jian.isSelected()){
res=i.subtract(j).doubleValue();
}
if(cheng.isSelected()){
res=i.multiply(j).doubleValue();
}
if(chu.isSelected()){
if(s==0){
JOptionPane.showMessageDialog(null, "分母不可为0!!!","警告",JOptionPane.ERROR_MESSAGE);
jta.setText(jta.getText()+"该题智障(分母不可为0)");
}
else{
try {
res=i.divide(j).doubleValue();
} catch (ArithmeticException e2) {
JOptionPane.showMessageDialog(null, "不做计算");
jta.setText(jta.getText()+"该题不做计算");
}
}
}
if(re==res){
JOptionPane.showMessageDialog(null, "正确","正确",JOptionPane.PLAIN_MESSAGE);
jta.setText(jta.getText()+result.getText()+" 正确");
}else{
JOptionPane.showMessageDialog(null, "错误","错误",JOptionPane.ERROR_MESSAGE);
jta.setText(jta.getText()+result.getText()+" 错误 ");
result.setText("");
}
}
}
if(e.getSource()==answer){
double o=Double.parseDouble(one.getText());
double s=Double.parseDouble(second.getText());
BigDecimal i= new BigDecimal(Double.toString(o));//使小数点运算更精密
BigDecimal j= new BigDecimal(Double.toString(s));//使小数点运算更精密
double res=0;
if(jia.isSelected()){
res=i.add(j).doubleValue();
JOptionPane.showMessageDialog(null, "<html><font size=25>答案:"+res+"</font></html>");
jta.setText(jta.getText()+" 查过答案! ");
}
if(jian.isSelected()){
res=i.subtract(j).doubleValue();
JOptionPane.showMessageDialog(null, "<html><font size=25>答案:"+res+"</font></html>");
jta.setText(jta.getText()+" 查过答案! ");
}
if(cheng.isSelected()){
res=i.multiply(j).doubleValue();
JOptionPane.showMessageDialog(null, "<html><font size=25>答案:"+res+"</font></html>");
jta.setText(jta.getText()+" 查过答案! ");
}
if(chu.isSelected()){
if(s==0){
JOptionPane.showMessageDialog(null, "分母不可为0!!!","警告",JOptionPane.ERROR_MESSAGE);
jta.setText(jta.getText()+"该题智障(分母不可为0)");
}
else{
try {
res=i.divide(j).doubleValue();
JOptionPane.showMessageDialog(null, "<html><font size=25>答案:"+res+"</font></html>");
jta.setText(jta.getText()+" 查过答案! ");
} catch (ArithmeticException e2) {
JOptionPane.showMessageDialog(null, "不做计算");
jta.setText(jta.getText()+"该题不做计算");
}
}
}
}
result.requestFocus();
}
}
class B implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==alert){
result.requestFocus();
String a="";
try {
if(b==1){
a=JOptionPane.showInputDialog(null,"输入出题范围(现为0~"+(i-1)+",最大随机数:"+(i-1)+"):\n0~","输入",JOptionPane.PLAIN_MESSAGE);
Integer j=new Integer(a);
i=j+1;
jta.setText(jta.getText()+"\n"+"修改出题范围(现为0~"+(i-1)+"):");
}else{
a=JOptionPane.showInputDialog(null,"输入出题范围(现为0~"+i+",最大随机数:"+(i-1)+"."+(b-1)+"):\n0~","输入",JOptionPane.PLAIN_MESSAGE);
Integer j=new Integer(a);
i=j;
jta.setText(jta.getText()+"\n"+"修改出题范围(现为0~"+i+"):");
}
} catch (NumberFormatException e2) {
}
}
if(e.getSource()==chuti){
if(b==1){
one.setText(r.nextInt(i)+"");
second.setText(r.nextInt(i)+"");
}else{
one.setText(r.nextInt(i)+"."+r.nextInt(b));
second.setText(r.nextInt(i)+"."+r.nextInt(b));
}
result.setText("");
if(jia.isSelected()){
jta.setText(jta.getText()+"\n"+one.getText()+jia.getText()+second.getText()+"=");
}else if(jian.isSelected()){
jta.setText(jta.getText()+"\n"+one.getText()+jian.getText()+second.getText()+"=");
}else if(cheng.isSelected()){
jta.setText(jta.getText()+"\n"+one.getText()+cheng.getText()+second.getText()+"=");
}else if(chu.isSelected()){
jta.setText(jta.getText()+"\n"+one.getText()+chu.getText()+second.getText()+"=");
}
result.requestFocus();
}
if(e.getSource()==one){
second.requestFocus();
}else if(e.getSource()==jia){
second.requestFocus();
one.setText("");
second.setText("");
jta.setText(jta.getText()+"\n修改运算符号:"+jia.getText());
result.setText("");
}else if(e.getSource()==jian){
second.requestFocus();
one.setText("");
second.setText("");
jta.setText(jta.getText()+"\n修改运算符号:"+jian.getText());
result.setText("");
}else if(e.getSource()==cheng){
second.requestFocus();
one.setText("");
second.setText("");
jta.setText(jta.getText()+"\n修改运算符号:"+cheng.getText());
result.setText("");
}else if(e.getSource()==chu){
second.requestFocus();
one.setText("");
second.setText("");
jta.setText(jta.getText()+"\n修改运算符号:"+chu.getText());
result.setText("");
}else if(e.getSource()==second){
result.requestFocus();
}
}
}
//限制文本域只可输入数字
class key extends KeyAdapter{
public void keyTyped(KeyEvent e) {
int s=(e.getKeyChar());
if(!(s>=KeyEvent.VK_0&&s<=KeyEvent.VK_9||s==KeyEvent.VK_PERIOD||s==KeyEvent.VK_MINUS))
e.consume();
if(e.getSource()==result){
if(s==KeyEvent.VK_ENTER){
check.doClick();
}
}
if(s==KeyEvent.VK_SPACE)
chuti.doClick();
}
}
class C extends WindowAdapter{
public void windowOpened(WindowEvent e) {
Date time=new Date();
DateFormat date=new SimpleDateFormat("YYYY年MM月dd日 HH:mm:ss");
String s1=date.format(time);
jta.setText("----------------"+s1+"-----------------");
}
public void windowClosing(java.awt.event.WindowEvent arg0){
BufferedReader br;
try {
br = new BufferedReader(new FileReader("D:\\出题.txt"));
String s="";
while((s=br.readLine())!=null){
jiu.setText(jiu.getText()+s+"\n");
}
br.close();
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
//保存记录
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\出题.txt"));
bw.write(jiu.getText().replaceAll("\n", "\r\n")+jta.getText().replaceAll("\n", "\r\n"));
if(bw!=null){
bw.close();
}
} catch (IOException e1) {
}
}
}
class MenuAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(clock)){
if(clock.getText().equals("解锁")){
one.setEditable(true);
second.setEditable(true);
one.setText("");
second.setText("");
result.setText("");
clock.setText("上锁");
one.requestFocus();
}else{
one.setEditable(false);
second.setEditable(false);
one.setText("");
second.setText("");
result.setText("");
clock.setText("解锁");
result.requestFocus();
}
}else if(e.getSource()==clockintroduce){
JOptionPane.showMessageDialog(null, "<html><font size=6><center>“解锁”</center></font>"
+ "<p>该功能可将不可编辑的文本框变为可以编辑,并将清空文本框的数,以方便用户做简单计算。</p>"
+ "<p>但编辑内容不记录在文本中!!!</p></html>","“解锁”",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==address){
JOptionPane.showMessageDialog(null, "<html><font size=6><center>保存路径</center></font>"
+ "当您关闭程序后,文本域中的所有信息将保存到</p><p><font color=red >D:\\出题.txt</font>。</p></html>"
,"保存路径",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==checkintroduce){
JOptionPane.showMessageDialog(null,
"<html><font size=6><center>“提交答案”</center></font>"
+ "凡是点了“提交答案”,可对用户所做的答案进行判断(正确或错误),并记录到文本域中,并将保存于</p><p><font color=red >D:\\出题.txt</font>。</p></html>"
,"“提交答案”",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==chutiintroduce){
JOptionPane.showMessageDialog(null,
"<html><font size=6><center>“出题”</center></font>"
+ "凡是点了“出题”,可得到随机题目,并记录到文本域中,并将保存于</p><p><font color=red >D:\\出题.txt</font>。</p></html>"
,"“出题”",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==answerintroduce){
JOptionPane.showMessageDialog(null,
"<html><font size=6><center>“查看答案”</center></font>"
+ "凡是点了“查看答案”,可得到随机题目或用户输入的数目计算的大难,并在文本域中显示“查过答案”字眼,并将保存于</p><p><font color=red >D:\\出题.txt</font>。</p></html>"
,"“查看答案”",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==alertintroduce){
JOptionPane.showMessageDialog(null,
"<html><font size=6><center>“修改出题范围”</center></font>"
+ "凡是点了“修改出题范围”,可修改随机出题的范围大小,默认为0~99.9,并将修改内容记录到文本域中,且将保存于</p><p><font color=red >D:\\出题.txt</font>。</p></html>"
,"“修改出题范围”",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==clearintroduce){
JOptionPane.showMessageDialog(null,
"<html><font size=6><center>“清除”</center></font>"
+ "凡是点了“清除”,可清除文本框内所有内容,不记录到文本域中。</p></html>"
,"“清除”",JOptionPane.PLAIN_MESSAGE);
}else if(e.getSource()==xdintroduce){
JOptionPane.showMessageDialog(null,
"<html><font size=6><center>“小数点位数”</center></font>"
+ "凡是点了“小数点位数”,可修改随机出题的小数点保留位数,默认为0.1,并将修改内容记录到文本域中,且将保存于</p><p><font color=red >D:\\出题.txt</font>。</p></html>"
,"“小数点位数”",JOptionPane.PLAIN_MESSAGE);
}
}
}
public static void main(String[] args) {
new Rdom("随机出题&简单计算!");
}
class color extends Thread{
@Override
public void run() {
while (true) {
if (t == 0)
e.setForeground(Color.red);
else if (t == 1)
e.setForeground(Color.pink);
else if (t == 2)
e.setForeground(Color.blue);
else if (t == 3)
e.setForeground(Color.cyan);
else if (t == 4)
e.setForeground(Color.green);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t++;
t = t % 5;
}
}
}
}