-2

2 つのノード間の最短パスを見つけるために、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();
    }
}
4

3 に答える 3

1

OK、コードを試してみると、画面に次のように表示されました。

ここに画像の説明を入力

私が見る限り、GUI が表示され、ノードに入ることができます。しかし、エッジを追加しようとすると、まだ「ノードの追加」モードのままです。したがって、問題は実際には実行ボタンではなく、その前にモードが変更されることです。現在のモードを保持する変数を作成してみてください。私は提案しますenum

enum eMode {ADD_NODES, ADD_EDGES, SELECT_START_NODE, SELECT_END_NODE, READY}

eMode mode = ADD_NODES;

下部のボタンのいずれかを押すと、このモードを変更できます。内部フレーム内またはノード ボタンの 1 つをクリックすると、まず現在のモードを確認します。モードに応じて、クリックした位置に新しいノードを追加するか、エッジを描画します (待機する必要がある場合があります)。ユーザーがこのために 2 番目のボタンをクリックする場合)、開始ノードまたは終了ノードを選択します。開始ノードと終了ノードの両方を選択すると、モードが に切り替わりますeMode.READY。このモードでは、実行ボタンを押すと、最短パス アルゴリズムが開始され、結果が表示されます。

于 2012-12-12T13:17:28.117 に答える
1

コードを試してみたので、問題はエッジの描画にあると思います。

次のことを試してください。 1. Enter Nodes をクリックしていくつかのノードを追加します。3. フレームのノード以外の場所をクリックしてみてください。まだノードを追加していることがわかります。

この時点で 2 つの問題があります。2. エッジを追加しようとしている場合、フレームではなくノード (jbutton) をクリックしているため、drawedge#de で追加したマウス イベントは決して呼び出されません。

于 2012-12-12T12:57:40.600 に答える
0

主な問題は、いくつかのスタイルの問題は別として、あなたの行動が実際に論理的であるかどうかを確認しなかったこと、単に B3、B4、B5 (実行ボタン) のいずれにもActionListener. ActionListener なし、アクションなし、作業なし、出力なし。または、何か不足していますか?

于 2012-12-12T13:04:20.090 に答える