我必须构建一个基于GUI的应用程序来查找两个节点之间的最短路径。
图表将由用户输入。然后,用户将使用节点和边绘制图形。在鼠标点击时,将创建一个节点。将鼠标从一个节点拖动到另一个节点时,将创建一个加权边。然后,用户将输入起始节点和结束节点。然后将标记最短路径,但输出不会显示。
错误是什么?
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
class plus extends JFrame {
int radius = 10, i = 0, x, y, x1, y1, x2, y2;
double dis;
int[] a = new int[100];
int[] b = new int[100];
JPanel panel2 = new JPanel();
JButton B1 = new JButton("Enter Nodes");
JButton B2 = new JButton("Draw Edges");
JButton B3 = new JButton("Start Node");
JButton B4 = new JButton("End Node");
JButton B5 = new JButton("Run");
JButton B6 = new JButton("Clear");
JButton button[] = new JButton[100];
JInternalFrame jInternalFrame1 = new JInternalFrame();
public plus() {
setTitle("Shortest Path Finding");
setSize(700, 600);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Container contentPane = getContentPane();
contentPane.add(jInternalFrame1, "Center");
contentPane.add(panel2, "South");
jInternalFrame1.setVisible(true);
jInternalFrame1.setBackground(Color.white);
panel2.add(B1);
panel2.add(B2);
panel2.add(B3);
panel2.add(B4);
panel2.add(B5);
panel2.add(B6);
B1.addActionListener(new B1Listener());
B2.addActionListener(new B2Listener());
/*B3.addActionListener(new B3Listener());
B4.addActionListener(new B4Listener());
B5.addActionListener(new B5Listener());*/
B6.addActionListener(new B6Listener());
}
class drawedge {
public void de() {
jInternalFrame1.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mousePressed(java.awt.event.MouseEvent event) {
jInternalFrame1MousePressed(event);
}
@Override
public void mouseReleased(java.awt.event.MouseEvent event) {
jInternalFrame1MouseReleased(event);
}
});
}
public void jInternalFrame1MousePressed(MouseEvent e) {
for (int l = 0; l < i; l++) {
if (e.getX() == a[l] && e.getY() == b[l]) {
x1 = a[l];
y1 = b[l];
break;
}
}
x1 = e.getX();
y1 = e.getY();
}
public void jInternalFrame1MouseReleased(MouseEvent e) {
for (int m = 0; m < i; m++) {
if (e.getX() == a[m] && e.getY() == b[m]) {
x2 = a[m];
y2 = b[m];
x2 = e.getX();
y2 = e.getY();
Graphics g = getGraphics();
g.drawLine(x1 - 10, y1 + 20, x2 - 10, y2 + 20);
dis = ((x2 - x1) * (x2 - x1) - (y2 - y1) * (y2 - y1)) / 10;
if (dis < 0) {
dis = dis * -1;
}
dis = Math.floor(Math.sqrt(dis));
g.drawString("" + dis, (x2 + x1) / 2, (y2 + y1) / 2);
}
}
}
}
class drawnode {
drawnode() {
jInternalFrame1.setVisible(true);
jInternalFrame1.getContentPane().setLayout(null);
}
public void dn() {
jInternalFrame1.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(java.awt.event.MouseEvent evt) {
jInternalFrame1MouseClicked(evt);
}
});
}
private void jInternalFrame1MouseClicked(MouseEvent e) {
x = e.getX();
y = e.getY();
button[i] = new JButton();
button[i].setBounds(x - 7, y - 30, 50, 30);
jInternalFrame1.getContentPane().add(button[i]);
button[i].setText(Integer.toString(i + 1));
i++;
a[i] = x - 7;
b[i] = y - 30;
}
}
class B1Listener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
drawnode d1 = new drawnode();
d1.dn();
}
}
class B2Listener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
drawedge d = new drawedge();
d.de();
}
}
/*class B3Listener implements ActionListener{
public void actionPerformed(ActionEvent event) {
}
}*/
class B6Listener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
jInternalFrame1.getContentPane().removeAll();
}
}
public static void main(String args[]) {
JFrame frame = new plus();
frame.setLocation(150, 50);
frame.show();
}
}
答案 0 :(得分:1)
尝试过代码之后我会假设问题在于绘制边缘。
尝试以下方法 1.单击“输入节点”并添加一些节点 2.单击绘制边缘并尝试绘制一些边缘 - 没有任何事情发生,所以我认为这是你的问题的根源。 3.尝试单击除节点之外的框架上的任何位置。你会看到你还在添加节点!
此时你有两个问题 1.您在drawingode#dn中添加了一个鼠标列表器,并且永远不会将其删除,因此您将继续添加节点。 2.如果您尝试添加边缘,则单击节点(jbutton)而不是框架,因此您在drawedge #de中添加的鼠标事件永远不会被调用。
答案 1 :(得分:1)
好的,只是尝试了你的代码,并在我的屏幕上得到以下信息:
据我所见,GUI显示,您可以输入节点。但是当我尝试添加边时,它仍处于“添加节点”模式。所以你的问题不是真正的运行按钮,而是在此之前模式改变。尝试创建一个保存当前模式的变量。我建议enum
:
enum eMode {ADD_NODES, ADD_EDGES, SELECT_START_NODE, SELECT_END_NODE, READY}
eMode mode = ADD_NODES;
按下底部的其中一个按钮可以更改此模式。当您在内部框架或其中一个节点按钮上单击时,首先要检查您所处的模式。根据模式,您可以在单击的位置添加新节点,绘制边缘(您可能需要等待为了让用户点击第二个按钮,请选择开始或结束节点。选择开始和结束节点后,模式将切换为eMode.READY
。在此模式下,按下运行按钮将启动最短路径算法并显示结果。
答案 2 :(得分:0)
我认为主要的问题是,除了一些风格问题,我没有检查你做的事情是否合乎逻辑,只是B3,B4和B5(也就是运行按钮)都没有{{ 1}}。没有ActionListener,没有动作,没有工作,没有输出。或者我错过了什么?