Swing GUI,输出不显示

时间:2012-12-12 12:41:40

标签: java swing

我必须构建一个基于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();
    }
}

3 个答案:

答案 0 :(得分:1)

尝试过代码之后我会假设问题在于绘制边缘。

尝试以下方法 1.单击“输入节点”并添加一些节点 2.单击绘制边缘并尝试绘制一些边缘 - 没有任何事情发生,所以我认为这是你的问题的根源。 3.尝试单击除节点之外的框架上的任何位置。你会看到你还在添加节点!

此时你有两个问题 1.您在drawingode#dn中添加了一个鼠标列表器,并且永远不会将其删除,因此您将继续添加节点。 2.如果您尝试添加边缘,则单击节点(jbutton)而不是框架,因此您在drawedge #de中添加的鼠标事件永远不会被调用。

答案 1 :(得分:1)

好的,只是尝试了你的代码,并在我的屏幕上得到以下信息:

enter image description here

据我所见,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,没有动作,没有工作,没有输出。或者我错过了什么?