Thread.sleep() freezes JFrame/GUI containing GraphStream graph

前端 未结 1 1328
情深已故
情深已故 2021-01-24 21:57

My JFrame containing an embedded single graph (Graphstream) freezes when I try to update it in a loop that calls Thread,sleep(). I have tried using the same update

相关标签:
1条回答
  • 2021-01-24 22:27

    Like @Frakool and @MadProgrammer suggested in the comments, if anyone is having similar issues, using SwingWorker and Swing Timer will provide the desired results. According to the documentation:

    In general, we recommend using Swing timers rather than general-purpose timers for GUI-related tasks because Swing timers all share the same, pre-existing timer thread and the GUI-related task automatically executes on the event-dispatch thread. However, you might use a general-purpose timer if you don't plan on touching the GUI from the timer, or need to perform lengthy processing.

    Here's how I used it to stop the gui freezing. I created a private inner SwingWorker class that uses a Swing Timer as below:

    private class BFSTask extends SwingWorker<LinkedList<Node>, Node>{
        private ArrayList<Node> visitedList;
        private int visitedIndex = 0;
        private boolean traversalDone = false;
        private Timer traversal = new Timer(AppWindow.speed, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                Node lastVisited = visitedList.get(visitedIndex);
                Edge visitedEdge = lastVisited.getEdgeBetween(lastVisited.getAttribute("parent", Node.class));
                visitedEdge.setAttribute("ui.color", 0.5);
                visitedIndex++;
                if(visitedIndex >= visitedList.size()){
                    traversal.stop();
                    traversalDone = true;
                    if(BFSAlgorithm.this.getPathToGoal() != null){
                        startTimer();
                    }
                }
            }
        });
    
         @Override
        protected LinkedList<Node> doInBackground() throws Exception {
            Node found = publishNodeBreadthFirst(getStartNode(), getGoalNode());
            if (found != null) {
                return getPathToGoal(found);
            } else{
                return null;
            }
        }
    
        @Override
        protected void process(List<Node> list) {
            visitedList = (ArrayList<Node>) list;
            traversal.start();
        }
    
        @Override
        protected void done() {
            try {
                BFSAlgorithm.this.pathToGoal = get();
                if(traversalDone && BFSAlgorithm.this.getPathToGoal() != null){
                    startTimer();
                }
                if(BFSAlgorithm.this.getPathToGoal() == null){
                    throw new NullPointerException("Goal Not Found.");
                }
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            } catch (NullPointerException e){
                JOptionPane.showMessageDialog(getAppWindow(), "Goal Node Not Found!", "Error", JOptionPane.ERROR_MESSAGE);
                getAppWindow().disableExceptClear();
                getAppWindow().changeStatus("Goal node not found");
    
            }
        }
    
        private LinkedList<Node> getPathToGoal(Node found) {
            LinkedList<Node> path = new LinkedList<>();
            Node parent = found.getAttribute("parent");
            path.addLast(found);
            while (parent != getStartNode()){
                path.addLast(parent);
                parent = parent.getAttribute("parent");
            }
            return path;
        }
    }
    
    0 讨论(0)
提交回复
热议问题