📄 mainsrc.java
字号:
package josephus;
/**
* <p>Title: Josephus</p>
* <p>Description: This is a algorithm to display Josephus</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: BHL</p>
* @author Linpeizhong
* @version 1.0
*/
import javax.swing.JLabel;
import javax.swing.border.Border;
import java.awt.Color;
import javax.swing.BorderFactory;
import java.awt.SystemColor;
/**节点类,用于每个节点属性的定义*/
class Node {
int flag; //序号
Node next; //指针
int mima; //密码
JLabel jLabel; //拥有的标签
//构造器方法,用于实现每个节点的密码序号m,密码n,标签JLabel
public Node(int m, int n, JLabel jLabel) {
flag = m;
mima = n;
this.jLabel = jLabel;
}
}
/**主功能类,用于运行时的界面控制*/
public class MainSrc {
//节点数
int s = 12;
//初始密码
int cs = 0;
//定义节点数组
int a[] = new int[s];
//声明界面类MainApplet的对象
MainApplet mainApplet;
//边线对象
Border border, border2;
//主功能类的构造器方法,用于对象数组,初始密码,界面类的初始化
public MainSrc(int a[], int cs, MainApplet mainApplet) {
this.a = a;
this.cs = cs;
this.mainApplet = mainApplet;
//调用初始化方法
init();
}
//初始化方法
public void init() {
//当点击主界面的按钮“开始”时,将调用MainSrc这个功能类,调用后“开始”按钮应该设置为不可用
mainApplet.jButton2.setEnabled(false);
//红色边线
border = BorderFactory.createLineBorder(Color.red, 10);
//系统控制的颜色的边线,也就是黑色边线
border2 = BorderFactory.createLineBorder(SystemColor.controlText, 1);
//赋值
int m1 = a[0], m2 = 0, m3 = cs;
//节点1的实现
Node a1 = new Node(1, m1, mainApplet.jLabels[0]);
//当前节点定位为节点a1
Node index = a1;
//初始化a1后的各个节点
for (int i = 2; i <= s; i++) { //初始化每个人
//通过密码数组的元素赋值密码
m2 = a[i - 1];
//让当前的节点的指针域指向下个节点
index.next = new Node(i, m2, mainApplet.jLabels[i - 1]);
//让当前节点的下个节点成为当前节点
index = index.next;
}
/**通过上面的赋值后,index最后定位在最后一个节点上,也就是第12个节点上,让
* 最后一个节点的指针域指向节点a1,这样就构造出了一个带有节点Node的循环单链表
*/
index.next = a1;
//当i=s时,循环结束,出队完毕
for (int i = 0; i < s; i++) {
for (int j = 0; j < m3 - 1; j++) {
index = index.next;
//让所有人的边线为黑色
for (int z = 0; z < mainApplet.jLabels.length; z++) {
mainApplet.jLabels[z].setBorder(border2);
}
//轮到报数的人的边线为红色
index.jLabel.setBorder(border);
//报数时时间暂停为界面类传递过来sd变量的值,而sd是通过JSlider来设置的,因而JSlider可以调节报数速度
try {
Thread.sleep(mainApplet.sd);
}
catch (InterruptedException ex1) {
ex1.printStackTrace();
}
}
//设置出列的前一位的边线为原先的颜色
index.jLabel.setBorder(border2);
//设置该出列的人的边线为
index.next.jLabel.setBorder(border);
//让红色边线在将要出列的人的地方停留时间tostop,同样也是通过组件JSlider调节
try {
Thread.sleep(mainApplet.toStop);
}
catch (InterruptedException ex2) {
ex2.printStackTrace();
}
//测试时使用,用于在控制台显示将要出列的人的号数
System.out.println("第" + index.next.flag + "人出局");
//在界面类的状态窗口显示出列情况
mainApplet.jTextArea1.append(index.next.flag + " ");
//让出列的号数的标签为不可见
index.next.jLabel.setVisible(false);
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
}
//把出列的号所拥有的密码为运行的密码
m3 = index.next.mima;
//删除节点,其实在链表中是让指针指向改变而已,这是出列,也是算法的重点
index.next = index.next.next;
}
//让所有的标签的边线为原先的颜色
for (int z = 0; z < mainApplet.jLabels.length; z++) {
mainApplet.jLabels[z].setBorder(border2);
}
//
mainApplet.jTextArea1.append("\n哈哈,测试结束结束啦!\n请观察测试的数据是不是和你想的一样呢?"+
"\n不妨点击一下显示图片按钮,看图更形象哦^_^");
//参数导入按钮设置为可用
mainApplet.jButton1.setEnabled(true);
//显示图片按钮设置为可用
mainApplet.jButton5.setEnabled(true);
//清除所有的密码标签内容
mainApplet.setNull();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -