最近闲来无事,想用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);
}
}
当然,这只是一个简单的抽签器雏形,后期也可以通过添加边框,按钮和色彩模糊让其更加完善,美观实用。