就是在 写了那个身高计算器之后,想再水一篇博客,哦不,想再增加一些功能。
起因是在之前班级知识竞赛上面有题目就是把英语单词乱序之后给同学们答题,我就有写一个程序输入完整的单词,然后输出乱序之后的单词,现在就是想设置成一个有界面方式输入输出的程序。
目录
思路分析:
这个就是和之前写的一样,详细可以看之前写的身高计算器,我基本上整体的框架没有改动的,就是把变量名字换了一下,让代码的可读性更好一些,布局还是也之前的一样的。
新增部分:
主要就是乱序功能的实现。
我是这里采用StringBuffer可变字符串来装也行,我是直接用String,就导致不能修改,要转成字符数组才能进行修改。
首先就是得到一个随机数,随机数的范围在[0,arr.length)里面,这样就不用担心数组下标越界的问题了。
再次就是通过一个循环,当前数组元素和使用随机数得到的数组元素就行交换,因为一直是交换,所以字符串的字符的个数和种类不会发生改变。
最后就是我数组直接toString得到的是数组的地址信息,所以我是选择用一个新的空字符串来连接,最后返回结果字符串。
//用来存储文本框输入的数据,因为不用计算,所以可以直接输出即可
String result="";
//单词乱序,
public String outOfOrder(String original) {
//随机数
Random r=new Random();
//用来保存结果
String result="";
//因为要修改每一个字符,所以需要转成字符串来实现
char []arr=original.toCharArray();
//乱序
for(int i=0;i<arr.length;i++) {
//在[0,length)的范围内生成一个随机数,不会出现越界的情况
int index=r.nextInt(arr.length);
//交换单词中字母的顺序,也就是打乱单词的顺序
char tmp=arr[i];
arr[i]=arr[index];
arr[index]=tmp;
}
for(int i=0;i<arr.length;i++) {
result+=arr[i];
}
return result;
}
事件绑定和警告:
这警告就和之前一样了,区别就是在判断的时候,之前是判断是否是浮点数,这里判断的是是否都是由英文字符构成的字符串,两者的正则表达式不同,其他的都是想类似的。
final JLabel warningLabel=new JLabel();//警告标签,放在弹窗里面
public void buttonAction() {
//按钮绑定动作事件,和自己绑定,自己实现的监听的方法
start.addActionListener(this);
reset.addActionListener(this);
}
//必须重写actionPerformed方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象
String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本
if(buttonName.equals("开始乱序")) {
//获取文本框内容
result=wordTextField.getText();
//正则表达式
String regex="[a-zA-Z]+";
if(result.matches(regex)) {
result=outOfOrder(result);
calculatorLabel.setText("乱序后的单词为:"+result);
}else {
//数据不对当然要弹出警告啦
//添加一个弹窗的警告
JDialog jDialog=new JDialog();//创建弹窗对象
jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示
jDialog.setSize(500,400);//设置弹窗的大小
jDialog.setAlwaysOnTop(true);//让弹窗置顶
jDialog.setLocationRelativeTo(null);//让弹窗居中
jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面
//设置字体的类型,加粗,和大小
warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));
//输出警告提示符
warningLabel.setText("单词输入不合法哦!!!");
//标签的位置和大小
warningLabel.setBounds(100,100,500,100);
//这个也要取消布局管理器才行
jDialog.getContentPane().setLayout(null);
//往弹窗中添加标签
jDialog.getContentPane().add(warningLabel);
jDialog.setVisible(true);//让弹窗显示出来
}
}else if(buttonName.equals("清空")) {
//清空文本框里面的内容
wordTextField.setText("");
}
}
完整代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class wordScramblerFrame extends JFrame implements ActionListener{
//主方法
public static void main(String[] args) {
wordScramblerFrame wsf=new wordScramblerFrame();
}
//组件数据
final JPanel panel=new JPanel();//面板
final JLabel wordLabel=new JLabel();//单词标签
final JTextField wordTextField=new JTextField();//单词文本框
final JLabel calculatorLabel=new JLabel();//乱序结果标签
final JButton start=new JButton();//开始乱序按钮
final JButton reset=new JButton();//清空按钮
final JLabel warningLabel=new JLabel();//警告标签,放在弹窗里面
//用来存储文本框输入的数据,因为不用计算,所以可以直接输出即可
String result="";
public wordScramblerFrame() {
//初始化框架
initFrame();
//初始化面板
initPanel();
//绑定监听事件
buttonAction();
//窗体可见
this.setVisible(true);
}
//初始化框架
public void initFrame() {
//设置软件的标题
this.setTitle("单词乱序器");
//设置窗体位置以及大小
this.setSize(500,300);
//设置窗体居中
this.setLocationRelativeTo(null);
//关闭按钮的动作为退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//初始化面板
public void initPanel() {
//初始化组件
initModule();
//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了
panel.setLayout(null);
//添加相关的组件
panel.add(wordLabel);
panel.add(wordTextField);
panel.add(calculatorLabel);
panel.add(start);
panel.add(reset);
this.setContentPane(panel);
}
//初始化组件
public void initModule() {
//初始化单词相关的组件
wordLabel.setText("单词:");
//设置字体的类型,加粗,和大小
wordLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,40));
//标签的位置和大小
wordLabel.setBounds(30,30,100,50);
//文本框的位置和大小
wordTextField.setBounds(130,30,150,50);
//初始化乱序后结果相关的数据
calculatorLabel.setText("乱序后的单词为:");
//设置字体的类型,加粗,和大小
calculatorLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));
//标签的位置和大小
calculatorLabel.setBounds(30,80,400,100);
//开始开始乱序
start.setBounds(290,30,90,50);
start.setText("开始乱序");
//清空按钮
reset.setBounds(390,30,90,50);
reset.setText("清空");
}
//单词乱序,
public String outOfOrder(String original) {
//随机数
Random r=new Random();
//用来保存结果
String result="";
//因为要修改每一个字符,所以需要转成字符串来实现
char []arr=original.toCharArray();
//乱序
for(int i=0;i<arr.length;i++) {
//在[0,length)的范围内生成一个随机数,不会出现越界的情况
int index=r.nextInt(arr.length);
//交换单词中字母的顺序,也就是打乱单词的顺序
char tmp=arr[i];
arr[i]=arr[index];
arr[index]=tmp;
}
for(int i=0;i<arr.length;i++) {
result+=arr[i];
}
return result;
}
public void buttonAction() {
//按钮绑定动作事件,和自己绑定,自己实现的监听的方法
start.addActionListener(this);
reset.addActionListener(this);
}
//必须重写actionPerformed方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象
String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本
if(buttonName.equals("开始乱序")) {
//获取文本框内容
result=wordTextField.getText();
//正则表达式
String regex="[a-zA-Z]+";
if(result.matches(regex)) {
result=outOfOrder(result);
calculatorLabel.setText("乱序后的单词为:"+result);
}else {
//数据不对当然要弹出警告啦
//添加一个弹窗的警告
JDialog jDialog=new JDialog();//创建弹窗对象
jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示
jDialog.setSize(500,400);//设置弹窗的大小
jDialog.setAlwaysOnTop(true);//让弹窗置顶
jDialog.setLocationRelativeTo(null);//让弹窗居中
jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面
//设置字体的类型,加粗,和大小
warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));
//输出警告提示符
warningLabel.setText("单词输入不合法哦!!!");
//标签的位置和大小
warningLabel.setBounds(100,100,500,100);
//这个也要取消布局管理器才行
jDialog.getContentPane().setLayout(null);
//往弹窗中添加标签
jDialog.getContentPane().add(warningLabel);
jDialog.setVisible(true);//让弹窗显示出来
}
}else if(buttonName.equals("清空")) {
//清空文本框里面的内容
wordTextField.setText("");
}
}
}
总结:
这还是很有意思的,可以让自己收获成就感。靠近光,追寻光,成为光,散发光。