这是我用SWING写的第一个程序的改进,也是学JAVA以来的第一个自己动手写的完整的程序。故把它的思路和过程写成一篇博客,以滋纪念和温习

先列出需要用到的知识:

  • 1.JFrame和JDialog的相关用法
  • 2.控件的动作事件监听的用法
  • 3.线程的暂停和恢复以及方法的重写
  • 4.一个向字符串数组追加字符串的算法

关于界面可以不用手撸代码,下载windowbuilder插件可以实现可视化的操作界面的布局,控件等。。。。。。
先上工程的截图

1.在主方法的文件里创建我们的主窗口类并让它继承JFrame
可以在构造函数直接调用
setDefaultCloseOperation()
setBounds(int x,int y,int width,int height) 设置坐标位置和长宽
setResizable(boolean b) 窗口是否可以最大化,true可以,false不可以
setTitle(String str) 窗口上方的标题
setVisible(boolean b) 窗口是否可见,同上
等方法对我们的窗口类进行必要的初始化

首先,我用一个标签来做背景图片,再用一个容器覆盖这个标签,将覆盖的容器隐藏
contentPane.setOpaque(boolean b)(容器对象的这个方法可以进行隐藏false隐藏true显示)
然后在后来的容器上加入三个按钮控件,一个标签用来显示号码
用控件提供的
setText(String)
setBounds(…)
等方法来调整大小和文字

还有一步可有可无,就是为控件左上角的小图标添加图片,
方法是这样的
(图片)先用URL 对象得到图片的相应路径
早用 Icon object = new ImageIcon(URL对象)
控件.setIcon(object);这个方法虽然复杂,但在导出的时候可以把图片一起打包。
(小图标)

Image im1 = new ImageIcon(包名.class.getResource(路径)).getImage();
this.setIconImage(new ImageIcon(im1).getImage());

最好建一个包把需要用到的图片文件放在里面,好管理一点

因为我是用windowbuilder来做的界面布局,直接给出我的程序截图

到这里界面布局就完成了,表面工作完成。
2.新建一个类文件继承JDialog来完成我们的号码添加功能
首先根据我们的目标功能,要实现号码的添加,我们就要实现字符串的输入,并把它保存。
这就需要一个文本框,也需要一个按钮来绑定得到我们输入的号码(字符串)
这一步比较简单
上截图如下

3.我们已经把表面的全都弄好了
现在我们需要开始添加动作监听了
1.主按钮要控制号码的滚动和暂停,
2.添加按钮要把添加号码的兑换框弹出
3.确认按钮要把得到的字符串写入我们在类中写好的用来提供号码的字符串数组

控件的监听代码如下

控件.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//这里是要发生的动作}}

通过提供的各种方法来实现功能
在这里贴出比较重要的主按钮的监听代码;

btn.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {String name = btn.getText();   //得到按钮上的文本if(name.equals("暂停")) {   //判断字符串的值是不是一样,实现两种状态的切换t.toSuspend();             //暂停线程的方法btn.setText("继续");         //设置文本btn.setIcon(i3);            //加载图片}else {t.toRever();                //线程恢复方法btn.setText("暂停");btn.setIcon(i2);}}});

接下来省去一个一个的添加监听

4.内部类实现线程的暂停和恢复

现在已经为控件添加了必要的动作监听,下一步就是线程的实现。
有2中方法可以在程序中实现线程,
一是在内部创建一个类去继承Thread类,
二是实现Runnable接口,通过接口提供的方法来达到效果

因为没有用过第2中方法,我们用第一中方法实现
现在贴出线程类的代码,

class mythread extends Thread{private boolean suspend = false;     //设置一个布尔变量来控制暂停和恢复public synchronized void toSuspend() {  //定义暂停的方法suspend = true;}public synchronized void toRever() {   //定义恢复的方法suspend = false;notify();  //唤醒当前休眠,挂起的线程,没有参数}public void run() {     //重新定义线程的run方法while(true) {    //设置一个永久的循环synchronized (this) {while(suspend) {  //用suspend来控制调用线程的wait()方法  try {wait();   //线程的停止方法} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}int rnd = new Random().nextInt(number.length); //设置一个整形数让它成为字符串的随机索引String str = number[rnd];num_area.setText(str);  //使标签显示数组中随机一个字符串}}}

5.向字符串数组追加字符串的算法,实现号码的动态添加
老实说,这个算法不是我自己想的,是看的一位C站老哥的博客里的,
当时正解了我燃眉之急,我试过用集合,也想过用整形数组(要把文本框的getText方法返回的字符串强制转化成整形,也不方便且开销大)
在这里感谢写那位我忘了名字的大哥,现在贴出他的算法

private static String[] insert(String[] arr, String str) {int size = arr.length;  //获取数组长度String[] tmp = new String[size + 1];  //新建临时字符串数组,在原来基础上长度加一for (int i = 0; i < size; i++){  //先遍历将原来的字符串数组数据添加到临时字符串数组tmp[i] = arr[i];}tmp[size] = str;  //在最后添加上需要追加的数据return tmp;  //返回拼接完成的字符串数组}

到这里这个程序就完成了
在最后贴出程序的源码

body.java

package body;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.ArrayList;
import java.util.Random;import javax.swing.JComboBox;
import javax.swing.JButton;public class body extends JFrame {private JPanel contentPane;ArrayList<String> list = new ArrayList<String>();String[] number = {"18317900456","13907625438"};/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {body frame = new body();frame.setVisible(true);frame.setTitle("电话号码抽奖升级");} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public body() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 506, 400);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);setResizable(false);URL u1 = body.class.getResource("/images/background.jpg");Icon i1 = new ImageIcon(u1);URL u3 = body.class.getResource("/images/Button20.jpg");Icon i3 = new ImageIcon(u3);Image im1 = new ImageIcon(body.class.getResource("/images/freedom.png")).getImage();this.setIconImage(new ImageIcon(im1).getImage());JPanel panel = new JPanel();panel.setBounds(0, 0, 500, 365);contentPane.add(panel);panel.setOpaque(false);panel.setLayout(null);JLabel num_area = new JLabel();num_area.setBounds(72, 94, 348, 95);panel.add(num_area);num_area.setFont(new Font("微软雅黑", Font.PLAIN, 48));num_area.setHorizontalAlignment(SwingConstants.CENTER);num_area.setForeground(Color.red);class mythread extends Thread{private boolean suspend = false;public synchronized void toSuspend() {suspend = true;}public synchronized void toRever() {suspend = false;notify();}public void run() {while(true) {synchronized (this) {while(suspend) {try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}int rnd = new Random().nextInt(number.length);String str = number[rnd];num_area.setText(str);}}}mythread t;t = new mythread();t.start();JButton btn = new JButton("暂停");btn.setBounds(117, 246, 270, 48);panel.add(btn);URL u2 = body.class.getResource("/images/Button1.jpg");Icon i2 = new ImageIcon(u2);btn.setIcon(i2);btn.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {String name = btn.getText();if(name.equals("暂停")) {t.toSuspend();btn.setText("继续");btn.setIcon(i3);}else {t.toRever();btn.setText("暂停");btn.setIcon(i2);}}});JButton button = new JButton("添加号码");button.setBounds(42, 307, 113, 27);panel.add(button);JButton confrom = new JButton("确认添加");confrom.setBounds(300, 307, 120, 27);panel.add(confrom);button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {needs io = new needs();confrom.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {number = insert(number,io.temp);io.dispose();}});}});JLabel background = new JLabel();background.setBounds(0, 0, 510, 365);contentPane.add(background);background.setIcon(i1);}private static String[] insert(String[] arr, String str) {int size = arr.length;  //获取数组长度String[] tmp = new String[size + 1];  //新建临时字符串数组,在原来基础上长度加一for (int i = 0; i < size; i++){  //先遍历将原来的字符串数组数据添加到临时字符串数组tmp[i] = arr[i];}tmp[size] = str;  //在最后添加上需要追加的数据return tmp;  //返回拼接完成的字符串数组}
}

needs.java

package body;import java.awt.BorderLayout;
import java.awt.FlowLayout;import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;public class needs extends JDialog {private final JPanel c = new JPanel();public JTextField textField;String temp;/*** Create the dialog.*/public needs() {setBounds(100, 100, 430, 281);getContentPane().setLayout(new BorderLayout());setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);setVisible(true);setTitle("请输入号码");c.setBorder(new EmptyBorder(5, 5, 5, 5));getContentPane().add(c, BorderLayout.CENTER);c.setLayout(null);{JPanel buttonPane = new JPanel();buttonPane.setBounds(0, 191, 418, 49);c.add(buttonPane);buttonPane.setLayout(null);{JButton okButton = new JButton("OK");okButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {temp = textField.getText();}});okButton.setBounds(257, 0, 113, 31);okButton.setActionCommand("确定");buttonPane.add(okButton);getRootPane().setDefaultButton(okButton);}}textField = new JTextField();textField.setBounds(56, 79, 286, 49);c.add(textField);textField.setColumns(10);}
}

用JAVA写一个电话号码滚动抽奖器相关推荐

  1. 用Java写一个电影自动下载器

    你好! 下面是一些步骤来帮助你写一个电影自动下载器: 建立一个新的Java项目 选择一个电影下载网站作为数据源, 并使用网络爬虫或API来获取电影的信息(如标题, 时长, 格式, 大小等) 使用Jav ...

  2. 抽奖滚动效果 python_Python使用Tkinter实现滚动抽奖器效果

    更多python教程请到: 菜鸟教程www.piaodoo.com 人人影视www.sfkyty.com 16影视www.591319.com 星辰影院www.591319.com 年底,抽奖这个话题 ...

  3. java音乐播放器所需jar包,这个用Java写的开源音乐播放器,我粉了

    原标题:这个用Java写的开源音乐播放器,我粉了 开源最前线(ID:OpenSourceTop) 随着版权意识的增强,如今想听几首歌,都得下载好几个音乐软件.这也就算了,大部分音乐还都是付费的,安装这 ...

  4. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  5. Python:tkinter滚动抽奖器

    滚动抽奖器(文字类型) https://www.jb51.net/article/177913.htm

  6. 怎样用java写一个简单的文件复制程序

    怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...

  7. java文件客户端下载_使用Java写一个minio的客户端上传下载文件

    标签:color   ati   tty   java   system   wired   format   media   param 前言: 确保已经安装了minio的服务端 代码: pom.x ...

  8. java实现迷你计算机,用JAVA写一个迷你编辑器.doc

    用JAVA写一个迷你编辑器 用JAVA编写一个迷你编辑器 WINDOWS的记事本程序是非常方便的一个文字处理工具,用它来编辑纯文本文件快捷而灵巧.我用JAVA写了一个编辑器程序,模仿"记事本 ...

  9. 用java写一个日历_使用JAVA写一个简单的日历

    JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...

最新文章

  1. C# Trim 的使用
  2. 二线制和四线制传感器的区别_三相四线制和三相五线制的解析,不少人都理解错了...
  3. 【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果
  4. ChoiceFormat:数字范围格式
  5. C#多线程时对同一资源加锁实现互斥访问
  6. P2转P3'dict' object has no attribute 'has_key'
  7. 思岚科技受邀2018高交会 携多项“黑科技”亮相
  8. 4.2.2 - Logical and/or Operators
  9. tensorflow不能安装问题之(wrapt)
  10. 转行python算法_转:Python:SMOTE算法
  11. Win10微软应用商店打不开/无响应/闪退/错误/无法加载的解决方法
  12. 有趣!用太极拳讲分布式理论,真舒服!
  13. amd一键超频怎么用_AMD Ryzen小白说明书——CPU超频篇
  14. fMRI Tutorial:FSL处理功能核磁共振数据
  15. python代码 素数集合 回文素数,反素数,梅森素数,双素数
  16. 磁场强度单位T(特斯拉)和高斯
  17. 计算机应用基础教程 rar,计算机应用基础教程全套1000p精选整理.ppt
  18. 知乎Live初体验,手把手教你如何开一场Live
  19. android hook 程序,Android hook框架之Xposed插件开发
  20. 什么是SFRplus色卡?

热门文章

  1. 第29讲 常见算法(查找算法、递归算法、排序算法)
  2. 愿你遍历山河,觉得人间值得。
  3. 【C语言】指针Pointer初阶(1)
  4. SuperMap工作空间文件sxw的文件格式说明
  5. Ubuntu 18.04 解压缩 abc.rar 文件
  6. 亚马逊云搭建windows_从亚马逊购买Windows 10时要防伪
  7. 计算机视觉——立体图像
  8. QQ号强制搜索查询教程
  9. 【选型指南】频谱分析仪配件 衰 减 器 选型的3个重要参数
  10. Ubuntu虚拟机无法与主机复制粘贴文字以及文件解决办法