多注了些控制流程,希望我的注释能够对你有帮助:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GoodLucky extends JFrame implements ActionListener{
JTextField tf = new JTextField(); //实例化一个文本域
//设置两个按钮
JButton b1 = new JButton("开始");
JButton b2 = new JButton("停止");
boolean isGo = false;
//构造函数
public GoodLucky(){
b1.setActionCommand("start");//在开始按钮上设置一个动作监听 start
JPanel p = new JPanel(); //实例化一个可视化容器
//将两个按钮添加到可视化容器上面,用add方法
p.add(b1);
p.add(b2);
//在两个按钮上增加监听的属性,自动调用下面的监听处理方法actionPerformed(ActionEvent e),如果要代码有更好的可读性,可用内部类实现动作
//监听处理。
b1.addActionListener(this);
b2.addActionListener(this);
//将停止按钮设置为不可编辑(即不可按的状态)
b2.setEnabled(false);
this.getContentPane().add(tf,"North"); //将上面的文本域放在面板的北方,也就是上面(上北下南左西右东)
this.getContentPane().add(p,"South"); //将可视化容器pannel放在南边,也就是下面
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置用户在此窗体上发起 "close" 时默认执行的操作,参数EXIT_ON_CLOSE是使用 System exit 方法退出应用程序。仅在应用程序中使用
this.setSize(300,200); //设置面板大小,宽和高
this.setLocation(300,300); //设置面板刚开始的出现的位置
Cursor cu = new Cursor(Cursor.HAND_CURSOR); //用指定名称创建一个新的定制光标对象,参数表示手状光标类型
this.setCursor(cu); //为指定的光标设置光标图像,即设置光标图像为上面所创建的手状光标类型
this.setVisible(true); //将面板可视化设置为true,即可视,如果为false,即程序运行时面板会隐藏
tf.setText("welcome you! "); //设置面板的标题为欢迎
this.go(); //调用go方法
}
public void go(){
while(true){ //这里是死循环,也就是说用户不点击停止按钮的话他一直循环出现随机数,直到用户点击停止按钮循环才能推出,具体流程在actionPerformed方法中控制。
if(isGo == true){ //上面所定义的isGo的初始值为false,所以程序第一次到此会跳过
String s = ""; //设置空字符串
for(int j = 1; j <= 7;j++){ //产生7个随机数
int i = (int)(Math.random() * 36) + 1;//每个随机数产生方式,这里定义灵活,可以自由定义随机数产生的方式
if(i < 10){
s = s + " 0" + i; //如果产生的随机数小于10的话做处理:这里就牵扯到一个重要的概念,简单叙述一下:
/*
当一个字符串与一个整型数项相加的意思是连接,上面的s = s + " 0" + i的意思是字符串s链接0再连接整型i值,而不会导致0和整型的i相加,
产生的效果为s0i,由于s为空字符串(上面定义过的),所以当i小于零时,在个位数前面加上0,比如产生的随机数i为7的话,显示效果为 07.
*/
}else{
s = s + " " + i; //如果产生的随机数比10打的话,那么加上空格显示,即数字和数字之间有个空格
}
//以上循环循环七次,以保证能出现7个随机数
}
tf.setText(s); //将产生的随机数全部显示在文本域上,用文本域对象tf调用它的设置文本的方法setText(String)实现。
}
//以下为线程延迟
try{
Thread.sleep(10); //线程类同步方法sleep,睡眠方法,括号里的单位为ms。
}catch(java.lang.InterruptedException e){
e.printStackTrace(); //异常捕获,不用多说。
}
}
}
//以下是上面设置的事件监听的具体处理办法,即监听时间处理方法,自动调用
public void actionPerformed(ActionEvent e){ //传入一个动作事件的参数e
String s = e.getActionCommand(); //设置字符串s来存储获得动作监听,上面的start
/*
以下这个条件语句块的作用为:用户点击开始后(捕获start,用方法getActionCommand()),将命令触发设置为true,从而执行上面的go方法中的循环体(因为循环体中要求isGo参数为true,而初始为false)。
执行循环快产生随机数,并将开始按钮不可编辑化,而用户只可以使用停止按钮去停止。如果用户按下停止时,也就是没有传入参数“start”的时候,
执行else语句块中的语句,isGo设置为false,将不执行上面go中的循环语句块,从而停止产生随机数,并显示,并且把开始按钮设置为可用,而把
停止按钮设置为不可用,等待用户按下开始再去开始新一轮循环产生随机数。
*/
if(s.equals("start")){ //如果捕获到start,也就是用户触发了动作监听器,那么下面处理
isGo = true; //设置isGo为true
b1.setEnabled(false); //将开始按钮设置为不可用
b2.setEnabled(true); //将停止按钮设置为可用
}else{
isGo = false; //将isGo设置为false,isGo为循环标志位
b2.setEnabled(false); //设置停止按钮为不可用(注意看是b2,b2是停止按钮)
b1.setEnabled(true); //设置开始按钮为可用
}
}
public static void main(String[] args){
new GoodLucky(); //产生类的实例,执行方法
}
}
圣诞平安夜了,祝朋友开心快乐!
JTextField tf = new JTextField(); //生成文本框
JButton b1 = new JButton("开始"); //开始按钮
JButton b2 = new JButton("停止"); //停止按钮
boolean isGo = false; //自定义标志, false表示程序未执行
public GoodLucky(){
b1.setActionCommand("start"); //为开始按钮设Action字符串为的是方便按下后知道是谁按的
JPanel p = new JPanel();// Jpanel是一个容器,里面可以放按钮文本框之类东西
p.add(b1); //把按钮放到上面的容器中
p.add(b2); //
b1.addActionListener(this); //为按钮指定监听器为本类,意思是按下后会通知本类,本类会调用actionPerformed方法以做出反应
b2.addActionListener(this); //同上
b2.setEnabled(false); //enabled后本按钮将无法点击,点击不起反应;
this.getContentPane().add(tf,"North"); //在本类(本类为一个JFrame容器)的北方安装好文本框
this.getContentPane().add(p,"South");//同上,在南方(下方)安装好Panel
这样,JFrame包含两个控件,上面是tf文本,下面是Panel面板,而Panel中又包含两个按钮
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //本界面的默认关闭方法是点击窗口右上角X按钮
this.setSize(300,200); //本界面长300高200
this.setLocation(300,300); //本界面位于屏幕 300,300位置
Cursor cu = new Cursor(Cursor.HAND_CURSOR); //下面生成鼠标图形
this.setCursor(cu);
this.setVisible(true); //使鼠标可见
tf.setText("welcome you! "); //在文本框中显示welcome you!字符
this.go(); //高用go()方法
}
public void go(){
......
//本方法每隔10毫秒循环一次 Thread.sleep(10)
//本方法只要不按下停止按钮就一直运行下去,以会看到 if(isGo == true)
//过会就会看到
//
for(int j = 1; j <= 7;j++){ //产生7位字符
int i = (int)(Math.random() * 36) + 1; //每一位字符随机产生,位于1~37之间
..........
}
tf.setText(s); //将产生的随机数显示到文本框中
}
//这个方法,如果本类implements了 ActionListener接口就必须写这个方法。
//没写就会报错, 写好这个方法后,每次按下按钮就会自动运行这个方法。
//当然,前提是按钮己经设置本类为监听器,在前面有写b1.addActionListener(this);
public void actionPerformed(ActionEvent e){
//得到标识,记得前面b1.setActionCommand("start"); 现在派上用场了!
String s = e.getActionCommand();
if(s.equals("start")){ //按下的是b1按钮
isGo = true;
b1.setEnabled(false); //使b1不可用,因为己开始,不能再开始
b2.setEnabled(true); //使b2可用,开始后就可以按停止了
}else{ //否则按下的是b2停止按钮
isGo = false; //标志为停止,留意前面的循环用到它,那个循环现在可退出了
b2.setEnabled(false); //使b2不可用,因为还没开始,不用按停止
b1.setEnabled(true); //b1可用
}
}
综上所述,本程序为一个随机选数字的程序,
数字在界面上不停跳动,你一按,它就停止,然后报一个数给你,这个在电视上摇奖摇手机号码的那种会经常看到的。
/***导入包**/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GoodLucky extends JFrame implements ActionListener{
JTextField tf = new JTextField(); //创建一个文本框
JButton b1 = new JButton("开始"); //创建一个开始按钮
JButton b2 = new JButton("停止"); //创建一个停止按钮
boolean isGo = false; //创建一个标记,用于控制随机数产生或停止
public GoodLucky(){ //
b1.setActionCommand("start"); //设置此按钮激发的操作事件的命令名称。
JPanel p = new JPanel(); //创建一个面板容器,用于放置组件
//添加两个按钮
p.add(b1);
p.add(b2);
//为两个按钮添加监视器
b1.addActionListener(this);
b2.addActionListener(this);
//停止按钮设置为不可编辑
b2.setEnabled(false);
//在主窗口中,添加文本框tf、面板容器P
this.getContentPane().add(tf,"North");
this.getContentPane().add(p,"South");
//设置主窗口关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//主窗口大小
this.setSize(300,200);
//主窗口的初始位
this.setLocation(300,300);
//创建一个光标对象,设置为手型
Cursor cu = new Cursor(Cursor.HAND_CURSOR);
this.setCursor(cu);
//主窗口设置为可见
this.setVisible(true);
//tf文本框中文本先设置为 welcome you!
tf.setText("welcome you! ");
//调用go()方法
this.go();
}
//此方法主要是产生7位随机数,并显示到文本框中
public void go(){
while(true){
if(isGo == true){
String s = "";
for(int j = 1; j <= 7;j++){
int i = (int)(Math.random() * 36) + 1;
if(i < 10){
s = s + " 0" + i;
}else{
s = s + " " + i;
}
}
//产生的字符串,放入到文本框中
tf.setText(s);
}
try{
//让线程休眠10豪秒
Thread.sleep(10);
}catch(java.lang.InterruptedException e){
e.printStackTrace();
}
}
}
//此方法是事件方法,
public void actionPerformed(ActionEvent e){
//得到事件源
String s = e.getActionCommand();
//如果是“开始”按钮
if(s.equals("start")){
//设置标记
isGo = true;
//设置“开始”按钮不可编辑
b1.setEnabled(false);
//设置“停止”按钮不可编辑
b2.setEnabled(true);
//如果是“停止”
}else{
//同理,同上,
isGo = false;
b2.setEnabled(false);
b1.setEnabled(true);
}
}
//main方法
public static void main(String[] args){
//创建一个别GoodLucky本身
new GoodLucky();
}
}
代码运行有错啊》。。
大家很热情。。