⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainsrc.java

📁 约瑟夫环javaApplet演示程序(源码).
💻 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 + -