用java制作一个简易抽签器

最近闲来无事,想用Java编写一个随机抽签器,最终编写后的运行结果是这样的
运行截图
下面说一下怎么具体实现,非常简单。

首先,要想出现这个滚动标签,首先必须要有一个窗口来承载它,所以要在main()方法中创建
出来一个窗口,位置和大小都可以自定义,合适即可。
	JFrame jf = new JFrame("随机抽签器");
	jf.setLocation(500, 200);
	jf.setSize(300, 300);
	jf.setResizable(false);
	jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	jf.setVisible(true);

几行代码,窗口就建好了,这里我设置的是窗口不可拉伸,关闭窗口即关闭该程序。

接下来,我们就要创建标签了,我们可以直接在主类里面进行创建,也可以新建一个类。因为Java是面向对象的开发思想,这里我选择的是新建一个PaintDraw类(继承JPanel类),在这个类里面对抽签器进行具体实现,之所以要继承JPanel类,是因为我们要将该类所绘制的内容放在一个面板上,再将此面板添加到我们刚才创建的窗口上。

随机抽签,随机数是不可少的。可以导入Random包,亦可以直接使用Math.random进行随机数的创建。

我们的标签内容都是文本,所以可以创建一个String类型的数组,用来存储标签内容,之后也便于
展示和调用。
	String[] text = new String[9];//创建内容数组,容量自定义
	int actionNumber = 1;//进行标记
	int resultNumber = (int)(Math.random()*(text.length));//初始化抽签结果标记(随机)
	
	public PaintDraw() {//抽签内容
		text = new String[]{" 打乒乓球"," 看剧"," 撸代码"," 听歌"," 钓鱼"," 动"," 玩手机"," 下电影"," 睡觉"};
	}

可以看到,我这里定义了两个变量,分别是actionNumber 和 resultNumber,这两个变量分别用来标记鼠标点击行为和抽签结果展示的数组下标(即程序刚开始是滚动显示,点击鼠标让其暂停,并随机展示标签数组中的一个元素)。

但是我想让代码重复利用度高一点,即打开程序后开始滚动,点击窗口暂停并展示结果,再点击窗口
继续进行滚动,依次这样,可是抽签多次。这样的话,展示的结果必然有多个,那么resultNumber
变量也必须在鼠标多次点击展示结果的时候产生多个随机数,所以产生随机数我单独写了个代码,一是
不容易混乱,而是方便调用。
public void changeText() {//如果活动标记为-1,说明抽签结束,要产生一个随机结果下标
		if (actionNumber == -1) {
			resultNumber = (int)(Math.random()*(text.length));
		}
	}
好了,接下来就是绘制面板了,因为窗口滚动显示文本和暂停显示抽签结果都是需要具备条件的,即
需要通过鼠标的单击事件,所以我们要给两种情况分别添加判断条件。
public void paint(Graphics g) {
		super.paint(g);
		g.drawRect(110, 100, 100, 30);
		g.drawString("点击窗口即可进行抽签...", 100, 170);
		
		if (actionNumber == -1) {//如果活动标记为-1,说明抽签结束,将changeText()方法随机生成的抽签结果下标进行展示
			g.setFont(new Font("华文新魏",Font.ITALIC,20));
			g.drawString(text[resultNumber], 120, 120);
		} else {
			//如果无变化,说明还没有进行抽签,继续展示滚动标签
			int index = (int)(Math.random()*(text.length));
			g.setFont(new Font("华文新魏",Font.ITALIC,20));
			g.drawString(text[index], 120, 120);
		}

}

这里面有个index,同样是产生随机下标的,之所以要放到里面,就是因为要达到滚动的效果。重绘一次产生一个随机下标,展示随机的标签内容。

下面是重绘的代码(这里是每隔80ms重绘一次):
	//对窗体内容进行重绘
	Timer time = new Timer();
	public void action() {
		time.schedule(new TimerTask(){
			public void run() {
				repaint();
			}
		},80,80);
	}

最后就要在main方法里把该面板加入窗口,并添加该面板的action方法,实现绘制的功能,同时要在窗口中添加一个鼠标单击事件监听。

main()方法的代码具体如下:
public static void main(String[] args) {
		PaintDraw pd = new PaintDraw();
		JFrame jf = new JFrame("随机抽签器");
		
		jf.setLocation(500, 200);
		jf.setSize(300, 300);
		jf.add(pd);
		pd.action();
		jf.setResizable(false);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
		
		jf.addMouseListener(new MouseAdapter() {//添加鼠标点击事件,如果点击,就让actionNumber的标记值取反为-1,执行changeText()方法,随机展示结果
			//并将结果绘制在窗口上;继续单击窗口,actionNumber的值恢复成1,继续执行滚动绘制程序,以便程序可以多次使用
			public void mousePressed(MouseEvent e) {
				pd.actionNumber = -pd.actionNumber;
				pd.changeText();
			}
		});
}

好了,这就做成了一个简易抽签器,也很简单。我把完整代码粘贴在下方:

完整代码如下:
package drawing;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;

/*
 * 抽签器
 * 随机抽签,点击窗口开始,再点击窗口结束,显示抽签结果
 */
public class Drawing {
	
	public static void main(String[] args) {
		PaintDraw pd = new PaintDraw();
		JFrame jf = new JFrame("随机抽签器");
		
		jf.setLocation(500, 200);
		jf.setSize(300, 300);
		jf.add(pd);
		pd.action();
		jf.setResizable(false);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
		
		jf.addMouseListener(new MouseAdapter() {//添加鼠标点击事件,如果点击,就让actionNumber的标记值取反为-1,执行changeText()方法,随机展示结果
			//并将结果绘制在窗口上;继续单击窗口,actionNumber的值恢复成1,继续执行滚动绘制程序,以便程序可以多次使用
			public void mousePressed(MouseEvent e) {
				pd.actionNumber = -pd.actionNumber;
				pd.changeText();
			}
		});
	}

}

class PaintDraw extends JPanel {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	String[] text = new String[9];//创建内容数组,容量自定义
	
	int actionNumber = 1;//进行标记
	
	int resultNumber = (int)(Math.random()*(text.length));//初始化抽签结果标记(随机)
	
	public PaintDraw() {//抽签内容
		text = new String[]{" 打乒乓球"," 看剧"," 撸代码"," 听歌"," 钓鱼"," 活动"," 玩手机"," 下电影"," 睡觉"};
	}
	
	public void changeText() {//如果活动标记为-1,说明抽签结束,要产生一个随机结果下标
		if (actionNumber == -1) {
			resultNumber = (int)(Math.random()*(text.length));
		}
	}
	
	public void paint(Graphics g) {
		super.paint(g);
		g.drawRect(110, 100, 100, 30);
		g.drawString("点击窗口即可进行抽签...", 100, 170);
		
		if (actionNumber == -1) {//如果活动标记为-1,说明抽签结束,将changeText()方法随机生成的抽签结果下标进行展示
			g.setFont(new Font("华文新魏",Font.ITALIC,20));
			g.drawString(text[resultNumber], 120, 120);
		} else {
			//如果无变化,说明还没有进行抽签,继续展示滚动标签
			int index = (int)(Math.random()*(text.length));
			g.setFont(new Font("华文新魏",Font.ITALIC,20));
			g.drawString(text[index], 120, 120);
		}

	}
	
	//对窗体内容进行重绘
	Timer time = new Timer();
	public void action() {
		time.schedule(new TimerTask(){
			public void run() {
				repaint();
			}
		},80,80);
	}
	
}

当然,这只是一个简单的抽签器雏形,后期也可以通过添加边框,按钮和色彩模糊让其更加完善,美观实用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值