Java GUI功能-子类问题?

Java GUI功能-子类问题?,java,swing,user-interface,Java,Swing,User Interface,我正在开发一个程序,该程序输出两个艺术家之间的最短路径(通过他们的整数ID知道)。开始和结束是两位艺术家使用的输入。我正在创建一个带有运行按钮和标签的GUI。按下按钮时,程序应计算最短路径,然后将其作为字符串返回并设置为GUI的标签。最短路径类似于5 73 19 100,其中每个int是艺术家的ID,5是开始艺术家,100是结束艺术家 我的最短路径代码(function()中的代码)在main中运行良好。然而,当我试图让GUI运行它时,最后的字符串只包含第一个艺术家。看来我的da.run已经不起

我正在开发一个程序,该程序输出两个艺术家之间的最短路径(通过他们的整数ID知道)。开始和结束是两位艺术家使用的输入。我正在创建一个带有运行按钮和标签的GUI。按下按钮时,程序应计算最短路径,然后将其作为字符串返回并设置为GUI的标签。最短路径类似于5 73 19 100,其中每个int是艺术家的ID,5是开始艺术家,100是结束艺术家

我的最短路径代码(function()中的代码)在main中运行良好。然而,当我试图让GUI运行它时,最后的字符串只包含第一个艺术家。看来我的da.run已经不起作用了?这是否与它在另一个类中的事实有关

任何关于可能发生的事情的建议都将不胜感激。这里是所有相关的GUI代码,因为我认为这就是问题所在

public class ShortestPath extends JFrame {

private static Map<Integer, Artist> artists = new HashMap<Integer, Artist>();
private static Artist start, end;
private static ArtistGraph map = new ArtistGraph(artists);
private static DijkstrasAlgorithm da = new DijkstrasAlgorithm(map);
private static Route r = new Route();

private static Connection connection;
private static Statement statement;

private Container contentPane;
private JPanel panel1, panel2;
private JButton button1;
private JLabel label1, label2, label3;
private JTextField field1, field2;

public ShortestPath() {
    //CODE FOR SETTING LABELS, PANELS, ETC REMOVED BECAUSE NOT RELEVANT FOR QUESTION
    button1.addActionListener(new Listener());
    panel1.add(button1);

    pack();
    setVisible(true);

}

private class Listener implements ActionListener
{
    public void actionPerformed(ActionEvent e)  
    {

        start = generateArtist(field1.getText());
        end = generateArtist(field2.getText());
        String done = function();


        label3.setText(done);


    }
}

 public static String function(){               
        ArtistGraph map = new ArtistGraph(artists);
        DijkstrasAlgorithm da = new DijkstrasAlgorithm(map);
        da.run(start, end);

        Route r = new Route();
        r.calculateRoute(end, da);

        for (int i = 0; i < r.getRoute().size(); i++) {
            int artist_id = r.getRoute().get(i).getID();
            System.out.println(artist_id);
        }

        String s = r.toString();

        return s;
    }
公共类最短路径扩展JFrame{
私有静态映射艺术家=新HashMap();
私人静态艺术家开始,结束;
私有静态ArtistGraph地图=新ArtistGraph(艺术家);
专用静态DijkstrasAlgorithm da=新DijkstrasAlgorithm(地图);
专用静态路由r=新路由();
专用静态连接;
私有静态语句;
专用容器内容窗格;
私人JPanel小组1、小组2;
私人按钮1;
私人JLabel标签1、标签2、标签3;
私有JTextField字段1、字段2;
公共最短路径(){
//设置标签、面板等的代码已删除,因为与问题无关
按钮1.addActionListener(新的Listener());
面板1.添加(按钮1);
包装();
setVisible(真);
}
私有类侦听器实现ActionListener
{
已执行的公共无效操作(操作事件e)
{
start=generateArtist(field1.getText());
end=generateArtist(field2.getText());
字符串done=函数();
label3.setText(完成);
}
}
公共静态字符串函数(){
ArtistGraph地图=新的ArtistGraph(艺术家);
DijkstrasAlgorithm da=新DijkstrasAlgorithm(地图);
da.运行(开始、结束);
路由r=新路由();
r、 计算器输出(结束,da);
对于(int i=0;i

让我知道是否还有其他代码有用。

没有足够的信息来识别您发布的代码中的特定缺陷。接下来,您可能希望查看模式,将您的模型(使用搜索的图形)与视图(GUI显示)隔离开来讨论了一个例子。由于搜索可能需要一些时间来完成,请考虑使用,举例说明。它将允许搜索在不阻塞GUI的情况下继续进行。

我不知道我们是否有足够的信息来猜测问题是什么。在您的<代码>函数(可能)中存在一个可能的问题。
在Swing事件线程上,EDT。也许您想在后台线程上执行此操作,但话虽如此,我怀疑这是否能解决您的主要问题。为此,我们需要查看更多代码,我认为,…请不要太多代码。:)对不起,我没有告诉您:(.您可能需要使用调试器或println语句进行一些调试,以了解有关该问题的更多信息。我将尝试尽快启动SSCCE。处理它我的猜测可能是某种数据可见性问题。GUI事件由单独的线程处理,您在此处使用的结构既不是线程安全的,也不提供线程安全性任何排序或可见性保证。例如,如果您从主线程(引用或内容)修改
artists
,这些更改可能不会被您的
函数()所在的Swing事件调度线程看到
被调用。顺便说一句,使用静态变量在函数之间传递数据不是好的设计,即使在单线程应用程序中也是如此。