最近闲来无事,想用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);}}

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

用java制作一个简易抽签器相关推荐

  1. 使用Java制作一个简易的远控终端

    使用Java制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端 ...

  2. 如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  3. 怎么用java做日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  4. java 制作简易日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  5. 用java编写日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  6. 运用Java制作一个属于自己的音乐播放软件

    运用Java制作一个属于自己的音乐播放软件 前言 上个寒假小编用python做了一个音乐播放软件(博客链接为:)运用tkinter.爬虫做了一个播放音乐的小程序(动态显示歌词[歌词向上翻滚]),觉得效 ...

  7. 使用python制作一个简易的远控终端

    使用python制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服 ...

  8. Android制作一个视频录制器

    制作一个视频录制器 API简介 此文将介绍如何使用AudioRecord,Camera2,Surface,MediaCodec来制作一个视频录制器. AudioRecord 用于录制音频,在此文中我用 ...

  9. 用java实现一个简易自动提款机

    用java实现一个简易自动提款机,且有以下要求 如何实现呢?首先,我们定义一个用户类User,同时根据要求设计好属性(本人部分命名没有使用驼峰命名法,不够规范).因为一个人可能有多个卡,卡号又不能重复 ...

最新文章

  1. 通过什么来衡量C# Socket服务的效能
  2. 【项目管理】ITTO-成本管理
  3. linux 串口控制read()的说明
  4. PHP中文字符串编码转换
  5. Linux基础之文件权限详解
  6. 垃圾回收算法与实现系列-JVM无锁实现
  7. 手机MODEM 开发(33)---SIM卡基础知识
  8. 计算机多媒体教室管理制度,新疆大学多媒体教室管理制度
  9. 严格对角占优矩阵特征值_对角占优矩阵的性质.doc
  10. 如何调用Sphinx 和api接口
  11. Allegro 导装配图
  12. Android AsyncTask的使用及泛式参数
  13. 一封来信,诉说了开源社区里的天涯若比邻
  14. 【愚公系列】2022年06月 ASP.NET Core下CellReport报表工具基本介绍和使用
  15. mov和mp4格式哪个好_如何快速做视频格式的转换
  16. 函数柯里化与反柯里化
  17. MIUI10国际版系统自定义字体设置办法
  18. 京信通信成功打造自动化工厂(MES应用案例)
  19. svn服务器安装位置,ubuntu下svn服务器安装配置--经过本人测试(非wwj)
  20. 电磁波的穿透能力总结

热门文章

  1. CLRS第二章思考题
  2. CLRS PARTⅠ
  3. Visual Studio 2022 vcvarsXXX.bat文件所在的目录
  4. oracle 内部表连接方式,oracle表连接方式
  5. 小白Jupyter快捷键
  6. 易语言单窗口单ip教程_怎样设置单窗口单ip登录游戏账号
  7. 一款以Python编码的自动化大规模漏洞测试工具
  8. AndroidStudio 集成海康威视 Android SDK,集成萤石Android SDK。
  9. 网络工程师水平考试备考资料(3)
  10. 内存管理-动态分区分配方式模拟