构建进度条而不启动新线程

2024-01-28

我需要在 a 中添加一个进度条JFrame但我想更新这个栏而不生成新线程(例如摇摆工人后台更新栏)。有没有办法更新当前线程(主 JFrame 的当前线程)中的进度条?

详细信息

我有第一类(“ChooseGUI”),它扩展 JFrame 并调用第二类。第二个类(“ProgressFrame”)是 JFrame 的另一个扩展:当我按下 ChooseGUI 中的按钮时,ChooseGUI 变得不可见,ProgressFrame(显示进度条)变得可见并调用 SwingWorker 来更新进度条。问题是 ChooseGUI 继续执行,而我希望 ChooseGUI 等待 ProgressBar 的“完成”

ChooseGUI类(一块)

  public class ChooseGUI extends JFrame{
            public ChooseGUI(IJavaProject project){
            super(project.getElementName());

            this.project = project;
            this.classi = new HashMap<ICompilationUnit,Boolean>();


            inizializeMap();




    JPanel p = createPanel();

                    if(p != null){

                        JScrollPane pane = new JScrollPane(p);
                        pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// disabilito la scrollbar orizzontale
                        pane.setSize(1000, 5000);
                    add(pane);

                    setLocationRelativeTo(null);
                    setResizable(true);
                    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    pack();
                    setVisible(true); 

                    }
                    else{


setVisible(false);
                    JOptionPane.showMessageDialog(null, "Classi not found!");
                }
    }


    private void inizializeMap(){
        ArrayList<ICompilationUnit> className = getClassNames();
        for(ICompilationUnit a : className){
            classi.put(a,false);
        }
    }



    private JPanel createPanel(){
        JPanel result = new JPanel(new GridLayout(0, 1));

        ArrayList<ICompilationUnit> className = getClassNames();


        int size = className.size();
        if(size > 0){       

            Collections.sort(className, new Comparator<ICompilationUnit>(){

                @Override
                public int compare(ICompilationUnit o1, ICompilationUnit o2) {
                     return o1.getElementName().compareTo(o2.getElementName());
                     }});

        for(int i = 0; i < size ; ++i){
            String name = className.get(i).getElementName();
            JCheckBox box = new JCheckBox(name);
            box.setActionCommand(name);

            box.addItemListener(this);
            result.add(box);

        }

        JButton confirm = new JButton(new ImageIcon(pathIconChoose));
        confirm.setSize(500, 1000);
        result.add(confirm);

        confirm.addActionListener(new ActionListener(){


            @SuppressWarnings("deprecation")
            @Override
            public void actionPerformed(ActionEvent arg0) {

                setVisible(false);


                int size = classi.size();

                if(size > 0){

                        BuildDB a = null;
                        try {
                            a = new BuildDB();
                        } catch (ClassNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    Set<ICompilationUnit> keySet2 = classi.keySet();
                    ArrayList<ICompilationUnit> units = new ArrayList<ICompilationUnit>();
                    for(ICompilationUnit unit: keySet2){
                        if(classi.get(unit) == true){
                                        units.add(unit);
                        }}



                            QueryAndManipulateDB t = new QueryAndManipulateDB(a);


                            ProgressFrame guiFrame = new ProgressFrame(units,t);


                           guiFrame.generateGUIAndUpdateDB();




                            //// quering
                            for(ICompilationUnit unit : units){         
                            ArrayList<Coppia> lista = new ArrayList<Coppia>();


                             ASTParser parser = ASTParser.newParser(AST.JLS3);
                             parser.setSource(unit);
                             CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
                             astRoot.recordModifications();
                             TypeDeclaration typeDeclaration = (TypeDeclaration)astRoot.types().get(0);


                             int length = typeDeclaration.getMethods().length;
                             if(length > 0){
                             for(int j = 0; j < length; ++j){
                             MethodDeclaration methodDecl = typeDeclaration.getMethods()[j];





                             Coppia c = t.getComment(unit.getElementName(), getSignature(methodDecl));

                             if(c.getCommenti().size() > 0){
                             lista.add(c);}
                             }


                             if(lista.size() > 0){
                             CommentoFrame f = new CommentoFrame(("Select Comment for " + unit.getElementName()),lista, unit);
                             f.setResizable(true);
                             f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                                f.pack();
                                f.setVisible(true);
                             }

                             else{
                                 JOptionPane.showMessageDialog(null, "Commenti non trovati per " + unit.getElementName());
                             }


                                dispose();
                             }



                }


                      a.closeConnection();//}
            }


            }


        });

        return result;}
        else
        {
            return null;
        }
    }

进度框架

public class ProgressFrame extends JFrame{

/**
 * 
 */
private static final long serialVersionUID = 1L;
private ArrayList<ICompilationUnit> units;
private QueryAndManipulateDB q;



public ProgressFrame(ArrayList<ICompilationUnit> units, QueryAndManipulateDB q){
    setLayout(new GridLayout(0,1));
    this.units = units;
    this.q = q;
}

public void generateGUIAndUpdateDB(){

    ArrayList<JPanel> panels = new ArrayList<JPanel>();
    for(int i = 0; i < units.size(); ++i){
        final String simpleClassName = units.get(i).getElementName();
        String fullClassName = units.get(i).getParent().getElementName() + "." + simpleClassName.substring(0, simpleClassName.length() - 5);


        JPanel pan = new JPanel();
        pan.setName(fullClassName);


        Introspection intro = new Introspection(fullClassName);
        //create progress bar        
        int size = intro.getMethodSignatures().size();
        JProgressBar progressBar = new JProgressBar(0,size);
        progressBar.setValue(0);

        JLabel label = new JLabel("Search for class " +  simpleClassName.substring(0, simpleClassName.length() - 5));
        label.setName(simpleClassName);

        pan.setLayout(new BorderLayout());
        pan.add(label, BorderLayout.NORTH);
        pan.add(progressBar, BorderLayout.CENTER);

        panels.add(pan);
        add(pan);



        final ClassEvaluating ce = new ClassEvaluating(pan);

        ce.addPropertyChangeListener(new PropertyChangeListener(){

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                 if (evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)) {


                    HashMap<String, ParagraphsList> paragraphsForMethods = ce.getResult();


                    for(String metodo : paragraphsForMethods.keySet()){
                        ParagraphsList par = paragraphsForMethods.get(metodo);
                        ArrayList<Comment> commenti = new ArrayList<Comment>();

                        List<Paragraph> list = par.getRankList();
                        for(Paragraph p: list){
                        double score = p.getScore();
                        if(score > 0)
                        commenti.add(new Comment(p.getText(),score));
                        }

                        Association ass = new Association(simpleClassName,metodo,commenti);
                        q.updateDB(ass);
                    }

                            }


            }

        });

        ce.execute(); }}}

类 ClassEvaluating是一个更新进度条的 SwingWorker。

会发生什么?当我在测试器中启动 ChooseGUI 时,JOptionPane 消息“Commenti non trovati per..”在进度条之前显示。我希望选择 GUY 等待 ProgressBar 为“完成”!


您的 EDT 线程最终将被阻塞。 您需要在后台执行任务,然后从那里更新进度条。

我的意思是更新进度条,设置其值。当您执行此操作时,GUI 会自动更新其在 EDT Thread 中的视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建进度条而不启动新线程 的相关文章

随机推荐

  • 检测移动设备和平板电脑设备

    我目前正在研究一些用于 PHP 检测手机的代码 这可能非常简单 现在我遇到了一个问题 我希望能够在我的 MVC 框架中为平板电脑 手机和网页制作独特的视图文件 所以我需要将平板电脑与其他移动设备分开 目前这是我正在使用的代码 public
  • 内存分配 char* 和 char[]

    这两者在内存分配方面有什么区别 char p1 hello char p2 hello 第一个创建了一个pointer变量 四个或八个字节的存储空间 具体取决于平台 并存储location那里有一个字符串文字 第二个创建一个array六个字
  • jQuery 里面的点击事件为

    我真的不知道我发生了什么事 代码如下 for var j 0 j
  • Android - 努力设计帐户选择器的样式

    我正在尝试在我的游戏中实现 AccountPicker 并且我尝试使用所有三个版本newChooseAccountIntent 2 来自AccountManager和一个来自AccountPicker 我的代码看起来像这样 if andro
  • PHP 中为什么有句点? [复制]

    这个问题在这里已经有答案了 可能的重复 如果在 php 字符串中间使用 句点 字符 是什么意思 https stackoverflow com questions 6104449 what does the period character
  • 将两个 byteBuffer 连接成一个

    您好 我有 2 个 byteBuffer 我想将它们连接在一起形成一个 byteBuffer 我在这里发现了类似的问题 但那里的建议都不适合我 你可以这样做 ByteBuffer b3 ByteBuffer allocate b1 limi
  • 什么时候删除 git 功能分支合适?

    我不想结束82 个特色分支悬挂在周围 https stackoverflow com questions 2353804 list git branches that can safely be deleted 所以我想知道将功能分支合并到
  • 如何用C/C++打开Chrome扩展程序中包含的文件?

    我正在尝试在 Chrome 扩展程序中打开一个要解析的文件 例如 config txt 通过 Javascript 这将相当容易 例如 chrome extension getURL config txt 会得到类似的东西chrome ex
  • 对 Intellij 产品中的控制台输出进行着色

    我有一个带有默认输出的自定义脚本 我想对错误 警告和信息进行着色 在 Intellij 产品 IDEA PhpStorm PyCharm 中有办法做到这一点吗 已经有一段时间了 但如果您仍然感兴趣 有一个用于控制台着色的新插件 与 Inte
  • 如何避免 IntelliTrace 事件中的 EF 查询被截断?

    我正在尝试调试实体框架查询 但是 当查询变得太大时 intelliTrace 中显示的查询会被截断 即使我将其复制并粘贴到记事本中 也仅显示查询的一部分 是否有任何解决方法可以获取 EF 生成的整个查询 提前致谢 已经有一段时间了 但它可能
  • 滚动时列表视图图像发生变化

    I am 解析 json数据在一个列表视图 图像视图和文本视图 首先四项列表视图的图像和文本视图正确添加但是当我滚动列表视图时 图像视图中的图像正在发生变化 这是我的代码 适配器 java public class Adapter exte
  • 角度插值无法正常工作?

    我有一个带有插值的样本 当使用任何一个事件时 它会正确显示下拉值 如下所示 sample click me https stackblitz com edit angular 234dlf file src 2Fapp 2Fapp comp
  • MSBuild (TFS) 中的 Nhibernate.Bytecode.Castle 问题

    我们有一个 Fluent NHibernate 映射测试正在本地计算机上通过 但是当我们签入 TFS 时 测试在构建服务器上失败 我们正在使用 MSTest 我们得到的错误是 NHibernate Bytecode UnableToLoad
  • 如何在不修改代码的情况下禁用在 pytest 中跳过测试?

    我继承了一些实现的代码pytest mark skipif进行一些测试 阅读 pytest 文档 我知道我可以添加条件 可能检查环境变量 或者使用更高级的功能pytest mark将测试组一起控制 不幸的是 到目前为止 文档中似乎没有任何内
  • 字幕与文字混合

    我尝试使用以下方法将字幕与纯文本分开two空格处 我的 Rmd 文档的第一部分如下所示 title Script de Limpieza errores de digitalizacion y division de base madre
  • 弱引用而不是 getActivity() (Android 避免内存泄漏)?

    为了避免内存泄漏 我编写了以下方法 该方法将在活动中使用 并且主要在片段中使用 使用继承 该方法应该允许我永远不会通过调用直接引用该活动 this or getActivity 方法是 private WeakReference
  • 以另一个用户身份运行任务

    使用卡皮斯特拉诺v3 我怎样才能跑all远程任务通过su作为另一个用户 我在官方文档中找不到任何内容 http capistranorb com http capistranorb com 对于我的用例 每个虚拟主机都有一个 SSH 用户和
  • 创建事件观察者以获得焦点?

    原型中是否可以有焦点事件冒泡 我试图避免在每个输入元素上分配一个观察者
  • python和node base64解码的区别

    我对这个base64解码问题感到困惑 似乎python和node js的做法不同 我相信 Node 正确地做到了这一点 有人能帮忙指出为什么 python 在这里不起作用吗 谢谢 Node gt console log Buffer fro
  • 构建进度条而不启动新线程

    我需要在 a 中添加一个进度条JFrame但我想更新这个栏而不生成新线程 例如摇摆工人后台更新栏 有没有办法更新当前线程 主 JFrame 的当前线程 中的进度条 详细信息 我有第一类 ChooseGUI 它扩展 JFrame 并调用第二类