import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/**
* GraphShow通过控制地图的显示以及和主窗口的联系来充当地图显示与主窗口的桥梁。
* @author Fe
*/
public class GraphShow {
GraphFromFile graph = null;
/**
* 容纳地图显示的Dialog。
*/
JDialog graphContainer;
/**
* 一张画布。在这张画布上具体画图像。画布添加到地图显示窗口中。
*/
MapCanvas mapCanvas = null;
/**
* 显示目前两届滇间路径长度的按钮。按下此按钮将弹出显示路径长度的信息框。
*/
static JButton showLength = new JButton("路由路径长度");
/**
* 用于关闭地图显示窗口。
*/
JButton ok = new JButton("确定");
/**
* 说明目前地图显示的信息的一条Label。通过程序的协调动态的显示目前的信息。
*/
static JLabel mapInfo = new JLabel("<html><font Size=6 Color=gray>" + "完整的路由节点地图" + "</font></html>");
public GraphShow() {
}
/**
* 在初始化构造其中完成地图显示窗口的基本显示控制。
* @param owner
* 主程序窗口
*/
public GraphShow(JFrame owner, GraphFromFile g) {
graph = g;
mapCanvas = new MapCanvas(graph);
graphContainer = new JDialog(owner, "RouterNodesShow", true);
graphContainer.getContentPane().setLayout(new BorderLayout());
graphContainer.getContentPane().add(mapCanvas, BorderLayout.CENTER);
JPanel temp = new JPanel();
temp.add(showLength);
temp.add(ok);
//用匿名内类实现使地图窗口不可见。
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
graphContainer.setVisible(false);
}
});
graphContainer.getContentPane().add(temp, BorderLayout.SOUTH);
JPanel temp1 = new JPanel();
temp1.add(mapInfo);
graphContainer.getContentPane().add(temp1, BorderLayout.NORTH);
//为显示路径长度按钮添加监听器。
AddAction action = new AddAction();
//将显示路径长度按钮设置为默认按钮。
graphContainer.getRootPane().setDefaultButton(showLength);
graphContainer.setSize(680, 710);
//得到屏幕的大小,即屏幕的分辨率。
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
graphContainer.setLocation(d.width/2-340, d.height/2-370);
graphContainer.setVisible(true);
//此处我也没有搞清楚到底怎么回事。
//反正如果没有这一句,显示路径长度的信息框的显示次数将随着对checkbox的点击次数的增加而增加。
showLength.removeActionListener(action);
}
/**
* 实现对showLength的动作添加。按下此按钮将弹出显示路径长度的信息框。
* <p>
* 之所以不用匿名内类来实现对showLength按钮的动作添加,是因为在程序中需要用到此内类的引用。
* </p>
* @author Fe
*/
protected class AddAction implements ActionListener {
public AddAction() {
showLength.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String nodeID[] = graph.getNodeID();
JOptionPane.showMessageDialog(graphContainer,
"从" + nodeID[sourceID] + "到" + nodeID[targetID] + "的路由距离为" + distance + "。",
"路由路径",
JOptionPane.INFORMATION_MESSAGE);
}
}
/**
* sourceID、targetID以及distance用于显示路径长度信息框时与主程序的通信。以实现动态地显示城市名称与路径长度。
*/
static int sourceID = -1, targetID = -1, distance = -1;
/**
* 与主程序的通信接口。用于动态地设置城市名称与路径长度。
* @param source
* 起始城市结点
* @param target
* 目标城市结点
* @param dist
* 两城市之间的路由距离
*/
public static void setLengthButtonInfo(int source, int target, int dist) {
sourceID = source;
targetID = target;
distance = dist;
}
/**
* 与主程序的通信接口。用于动态地控制路径长路按钮的enablity。
* @param enable
* 显示路径按钮是否可用。true为可用,false为不可用。
*/
public static void setLengthButtonEnable(boolean enable) {
showLength.setEnabled(enable);
}
/**
* 与主程序的通信接口。用于动态地控制说明目前地图显示的信息的Label。
* @param text
* 地图上方显示的具体信息
*/
public static void setLabelText(String text) {
mapInfo.setText("<html><font Size=6 Color=gray>" + text + "</font></html>");
}
}