package Dijkstra;
import java.awt.*;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;
public class MainWindow extends Frame implements ActionListener {
public static MainWindow mw;
public static JFrame frame;
public static JPanel mainPanel;
public static JPanel menuPanel;
public static JLabel lsv;
public static JTextField tsv;
public static JLabel laddv;
public static JTextField taddv;
public static JLabel ldeletev;
public static JTextField tdeletev;
public static JButton update;
public static ArrayList<JLabel> Nodes;
public static ArrayList<JTextField> Costs;
public static int node = 5;
public static int start;
public static int add;
public static int delete;
public static GridLayout layout;
public static Select select;
private static ArrayList<String> nodeName;
private static int[][] cost;
public static JLabel label;
public static JTextArea result;
public MainWindow()
{
frame = new JFrame("路由软件");
mainPanel = new JPanel();
menuPanel = new JPanel();
Nodes = new ArrayList<JLabel>();
Costs = new ArrayList<JTextField>();
layout = new GridLayout(node + 1, node + 1);
label = new JLabel();
lsv = new JLabel("初始节点:");
tsv = new JTextField();
laddv = new JLabel("添加节点:");
taddv = new JTextField();
ldeletev = new JLabel("删除节点:");
tdeletev = new JTextField();
update = new JButton("确定");
result = new JTextArea(14, 20);
result.setText("结果如下:\n");
result.setEditable(false);
result.setLineWrap(true);
result.setWrapStyleWord(true);
lsv.setHorizontalAlignment(JTextField.CENTER);
lsv.setFont(new Font("华文新魏", Font.BOLD, 25));
laddv.setHorizontalAlignment(JTextField.CENTER);
laddv.setFont(new Font("华文新魏", Font.BOLD, 25));
ldeletev.setHorizontalAlignment(JTextField.CENTER);
ldeletev.setFont(new Font("华文新魏", Font.BOLD, 25));
tsv.setHorizontalAlignment(JTextField.CENTER);
tsv.setFont(new Font("华文新魏", Font.BOLD, 25));
taddv.setHorizontalAlignment(JTextField.CENTER);
taddv.setFont(new Font("华文新魏", Font.BOLD, 25));
tdeletev.setHorizontalAlignment(JTextField.CENTER);
tdeletev.setFont(new Font("华文新魏", Font.BOLD, 25));
update.setHorizontalAlignment(JTextField.CENTER);
update.setFont(new Font("华文新魏", Font.BOLD, 25));
result.setFont(new Font("华文新魏", Font.BOLD, 25));
update.addActionListener(this);
}
public static void main(String []args){
mw = new MainWindow();
nodeName = new ArrayList<String>();
nodeName.add("u");
nodeName.add("x");
nodeName.add("y");
nodeName.add("z");
nodeName.add("w");
mw.DrawWindow(node);
}
public void DrawWindow(int node)
{
if(add != 0)
{
nodeName.add(taddv.getText());
}
frame.setSize(1000, 800);
frame.setLocationRelativeTo(null);
mainPanel.setLayout(layout);
mainPanel.add(label, 0);
for(int i = 0; i < node; i++)
{
//横向节点名
JLabel label1 = new JLabel(nodeName.get(i));
label1.setHorizontalAlignment(JTextField.CENTER);
label1.setFont(new Font("华文新魏", Font.BOLD, 25));
Nodes.add(label1);
mainPanel.add(Nodes.get(i));
}
for(int i =0; i < node; i++)
{
//纵向节点名
JLabel label2 = new JLabel(nodeName.get(i));
label2.setHorizontalAlignment(JTextField.CENTER);
label2.setFont(new Font("华文新魏", Font.BOLD, 25));
label2.setAlignmentX(CENTER_ALIGNMENT);
Nodes.add(label2);
mainPanel.add(Nodes.get(i + node));
for(int j = 0; j < node; j++)
{
JTextField text = new JTextField();
text.setHorizontalAlignment(JTextField.CENTER);
text.setFont(new Font("华文新魏", Font.BOLD, 25));
if(i >= j)
{
text.setEditable(false);
}
if(i == j)
{
text.setText("0");
}
if(i < j)
{
if((add != 0) && (j < node - 1))
{
text.setText(String.valueOf(cost[i][j]));
}
if(delete != 0)
{
text.setText(String.valueOf(cost[i][j]));
}
}
Costs.add(text);
mainPanel.add(Costs.get(j + i * node));
}
}
GridLayout layout1 = new GridLayout(3, 2);
GridBagLayout layout2 = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
c.fill =GridBagConstraints.VERTICAL;
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
menuPanel.setLayout(layout2);
c.gridx = 0; //x grid position
c.gridy = 0; //y grid position
layout2.setConstraints(panel1, c); //associate the label with a constraint object
menuPanel.add(panel1);
c.gridx = 0; //x grid position
c.gridy = 1; //y grid position
layout2.setConstraints(panel2, c); //associate the label with a constraint object
menuPanel.add(panel2);
c.gridx = 0; //x grid position
c.gridy = 2; //y grid position
layout2.setConstraints(panel3, c); //associate the label with a constraint object
menuPanel.add(panel3);
panel1.setLayout(layout1);
panel1.add(lsv);
panel1.add(tsv);
panel1.add(laddv);
panel1.add(taddv);
panel1.add(ldeletev);
panel1.add(tdeletev);
panel2.add(update);
panel3.add(result);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel, BorderLayout.CENTER);
frame.add(menuPanel, BorderLayout.EAST);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() instanceof JButton)
{
cost = new int[node][node];
for(int i = 0; i < node; i++)
{
for(int j = 0; j < node; j++)
{
if(i < j)
{
if(!MainWindow.Costs.get(j + i * node).getText().equals(""))
{
cost[i][j] = Integer.parseInt(MainWindow.Costs.get(j + i * node).getText());
}
}
else if(i > j)
{
cost[i][j] = cost[j][i];
}
else
{
cost[i][j] = 0;
}
}
}
if(!tsv.getText().equals(""))
{
for(int i = 0; i < node; i++)
{
if(nodeName.get(i).equals(tsv.getText()))
{
start = i;
break;
}
}
}
if(taddv.getText().equals(""))
{
add = 0;
}
else
{
node += 1;
add = node;
nodeName.add(taddv.getText());
frame.dispose();
new MainWindow().DrawWindow(node);
}
if(tdeletev.getText().equals(""))
{
delete = 0;
}
else
{
for(int i = 0; i < node; i++)
{
if(nodeName.get(i).equals(tdeletev.getText()))
{
delete = i;
node -= 1;
nodeName.remove(delete);
for(int k = delete; k < node; k++)
{
for(int j = 0; j < node; j++)
{
cost[j][k] = cost[j][k + 1];
}
cost[k] = cost[k + 1];
}
frame.dispose();
new MainWindow().DrawWindow(node);
break;
}
}
}
if((add == 0) && (delete == 0))
{
select = new Select(node, start, cost);
}
}
if(select != null){
result.setText(select.getOut());
}
}
}