JFrame动态显示距离矢量算法过程

基本的按钮动作监听

多个同样的文本域可以用数组做。

package disvec;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.*;

public class Main extends JFrame implements ActionListener, FocusListener {
    int[][] dist;
    int[][] jmp;
    final int NN=9;
    int [][] map;
    JPanel picPanel;
    JTextArea listA;
    JTextArea listB;
    JTextArea listC;
    JTextArea listD;
    JTextArea listE;
    JTextArea listF;
    JTextArea listG;
    JTextArea listH;
    JPanel A;
    JPanel B;
    JPanel C;
    JPanel D;
    JPanel E;
    JPanel F;
    JPanel G;
    JPanel H;
    JLabel pic ;
    JButton next;
    final  int n=8;
    final  int oo=1000000010;
    int[][] olddist,oldjmp;
    public void initArray(){
        olddist=new int[NN][NN];
        oldjmp=new int[NN][NN];
        map = new int[][]{
            {oo,oo,oo,oo,oo,oo,oo,oo,oo},
            {oo,0,2,oo,oo,oo,oo,6,oo},
            {oo,2,0,7,oo,2,oo,oo,oo},
            {oo,oo,7,0,3,oo,3,oo,oo},
            {oo,oo,oo,4,0,oo,oo,oo,2},
            {oo,oo,2,oo,oo,0,2,1,oo},
            {oo,oo,oo,3,oo,2,0,oo,2},
            {oo,6,oo,oo,oo,1,oo,0,4},
            {oo,oo,oo,oo,2,oo,2,4,0}
        };
        dist= new int[NN][NN];
        jmp=new int[NN][NN];
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
            dist[i][j]=map[i][j];
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(dist[i][j]<oo)jmp[i][j]=j;
                else jmp[i][j]=-1;
            }
        }
    }
    public void initPicPanel(){
        picPanel =new JPanel();
        picPanel.setPreferredSize(new Dimension(1100, 200));
        picPanel.setBackground(Color.white);
        picPanel.setBorder(BorderFactory.createTitledBorder("Map"));
        picPanel.add(pic);
    }
    public void initTexField(){
        listA=new JTextArea();
        listB=new JTextArea();
        listC=new JTextArea();
        listD=new JTextArea();
        listE=new JTextArea();
        listF=new JTextArea();
        listG=new JTextArea();
        listH=new JTextArea();
        A=new JPanel();
        B=new JPanel();
        C=new JPanel();
        D=new JPanel();
        E=new JPanel();
        F=new JPanel();
        G=new JPanel();
        H=new JPanel();
        A.setPreferredSize(new Dimension(135, 300));
        A.setBackground(Color.white);
        A.setBorder(BorderFactory.createTitledBorder("listA"));
        A.add(listA);
        B.setPreferredSize(new Dimension(135, 300));
        B.setBackground(Color.white);
        B.setBorder(BorderFactory.createTitledBorder("listB"));
        B.add(listB);
        C.setPreferredSize(new Dimension(135, 300));
        C.setBackground(Color.white);
        C.setBorder(BorderFactory.createTitledBorder("listC"));
        C.add(listC);
        D.setPreferredSize(new Dimension(135, 300));
        D.setBackground(Color.white);
        D.setBorder(BorderFactory.createTitledBorder("listD"));
        D.add(listD);
        E.setPreferredSize(new Dimension(135, 300));
        E.setBackground(Color.white);
        E.setBorder(BorderFactory.createTitledBorder("listE"));
        E.add(listE);
        F.setPreferredSize(new Dimension(135, 300));
        F.setBackground(Color.white);
        F.setBorder(BorderFactory.createTitledBorder("listF"));
        F.add(listF);
        G.setPreferredSize(new Dimension(135, 300));
        G.setBackground(Color.white);
        G.setBorder(BorderFactory.createTitledBorder("listG"));
        G.add(listG);
        H.setPreferredSize(new Dimension(135, 300));
        H.setBackground(Color.white);
        H.setBorder(BorderFactory.createTitledBorder("listH"));
        H.add(listH);
    }
    public void initButton(){
        next=new JButton("next time");
        next.addActionListener(this);
    }
    public void makeFrame(){
        this.setTitle("Distance Vector Routing");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new FlowLayout());
        this.add(picPanel);
        this.add(A);
        this.add(B);
        this.add(C);
        this.add(D);
        this.add(E);
        this.add(F);
        this.add(G);
        this.add(H);
        this.add(next);
        this.setVisible(true);
        this.setSize(1200,600);
    }
    void BellmanFord(){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                olddist[i][j]=dist[i][j];
                oldjmp[i][j]=jmp[i][j];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(j==i)continue;
                if(map[i][j]<oo){
                    for(int k=1;k<=8;k++){
                        if(olddist[j][k]<oo){
                            if(olddist[i][k]>=oo){//i表没有项目k
                                dist[i][k]=olddist[j][k]+map[i][j];
                                jmp[i][k]=j;
                            }
                            else{
                                if(oldjmp[i][k]!=j){
                                    if(olddist[j][k]+map[i][j]<olddist[i][k]){
                                        dist[i][k]=olddist[j][k]+map[i][j];
                                        jmp[i][k]=j;
                                    }
                                }
                                else{
                                    dist[i][k]=olddist[i][j]+olddist[j][k];
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    public void display(){
        listA.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[1][i]-1);
            if(i==1||dist[1][i]>=oo)listA.append(cc+" "+"N"+" "+"/"+"\n");
            else listA.append(cc+" "+dist[1][i]+" "+cc2+"\n");
        }
        listB.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[2][i]-1);
            if(i==2||dist[2][i]>=oo)listB.append(cc+" "+"N"+" "+"/"+"\n");
            else listB.append(cc+" "+dist[2][i]+" "+cc2+"\n");
        }
        listC.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[3][i]-1);
            if(i==3||dist[3][i]>=oo)listC.append(cc+" "+"N"+" "+"/"+"\n");
            else listC.append(cc+" "+dist[3][i]+" "+cc2+"\n");
        }
        listD.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[4][i]-1);
            if(i==4||dist[4][i]>=oo)listD.append(cc+" "+"N"+" "+"/"+"\n");
            else listD.append(cc+" "+dist[4][i]+" "+cc2+"\n");
        }
        listE.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[5][i]-1);
            if(i==5||dist[5][i]>=oo)listE.append(cc+" "+"N"+" "+"/"+"\n");
            else listE.append(cc+" "+dist[5][i]+" "+cc2+"\n");
        }
        listF.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[6][i]-1);
            if(i==6||dist[6][i]>=oo)listF.append(cc+" "+"N"+" "+"/"+"\n");
            else listF.append(cc+" "+dist[6][i]+" "+cc2+"\n");
        }
        listG.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[7][i]-1);
            if(i==7||dist[7][i]>=oo)listG.append(cc+" "+"N"+" "+"/"+"\n");
            else listG.append(cc+" "+dist[7][i]+" "+cc2+"\n");
        }
        listH.setText("");
        for(int i=1;i<=n;i++){
            char cc= (char) ('A'+i-1);
            char cc2= (char) ('A'+jmp[8][i]-1);
            if(i==8||dist[8][i]>=oo)listH.append(cc+" "+"N"+" "+"/"+"\n");
            else listH.append(cc+" "+dist[8][i]+" "+cc2+"\n");
        }
    }
    public Main(){
        pic = new JLabel(new ImageIcon("D:\\disVec\\src\\disvec\\图片1.png"));
        initArray();
        initPicPanel();
        initTexField();
        initButton();
        makeFrame();
        display();
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==next){
            BellmanFord();
            display();
        }
    }
    public void focusGained(FocusEvent e) {
        ;
    }
    public void focusLost(FocusEvent e) {
        ;
    }
    public static void main(String[] args) {
        new Main();
    }

}

效果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值