2013-02-18 84 views
-1

我需要在的JFrame添加一个进度条,但我想不会产生一个新的线程(例如SwingWorker的的背景下,更新吧)更新此栏。有没有办法更新当前线程(主JFrame的当前线程)进度条?建立一个进度条,而无需启动一个新的线程

在细节

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

类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 ..”。我希望ChooseGUI等待ProgressBar的'完成'!

+4

*” ..但我要更新这个酒吧而不会生成新的线程。“*为什么? – 2013-02-18 12:46:09

+1

当然,您可以在主线程中更新进度条,但这可能会阻止您的用户界面。 – 2013-02-18 12:48:10

+0

并在哪个线程ChooseGUI运行?在主线程中?我认为如果你发布一些代码可能会更好。 – 2013-02-18 13:02:35

回答

2

您将最终阻止您的EDT主题。 你需要在后台完成你的任务,并且你会从那里更新你的进度条。

通过更新您的进度条我的意思是,设置它的值。当你这样做时,GUI会自动在EDT Thread中更新它的视图。

2

您应该使用模态对话框阻止:

编辑:在美国东部时间进度可视化 - 这也可以做你的PropertyChangeEvent

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

    public Test() { 
     createAndShowGUI(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 

    private void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setSize(500, 500); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(new JButton(openChooseGUI()), BorderLayout.SOUTH);  
     frame.setVisible(true); 
    } 

    private Action openChooseGUI() { 
     return new AbstractAction("ChooseGUI") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       new ChooseGUI().setVisible(true); 
      } 
     }; 
    } 

    public class ChooseGUI extends JFrame { 

     public ChooseGUI() { 
      setSize(200, 200); 
      setLocationRelativeTo(null); 
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      getContentPane().setLayout(new BorderLayout()); 
      getContentPane().add(new JLabel("This is ChooseGUI"), BorderLayout.CENTER); 
      init(); 
     } 

     private void init() { 
      final JDialog progressDialog = new JDialog(this, true); 
      final JProgressBar progress = new JProgressBar(JProgressBar.HORIZONTAL); 
      progress.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        // TODO Auto-generated method stub 
        int current = ((JProgressBar)e.getSource()).getValue(); 
        if(current >= 100) { 
         progressDialog.dispose(); 
        } 
       } 
      }); 

      progressDialog.setSize(400, 100); 
      progressDialog.setLocationRelativeTo(this); 
      progressDialog.getContentPane().setLayout(new BorderLayout()); 
      progressDialog.getContentPane().add(progress, BorderLayout.NORTH); 
      progressDialog.getContentPane().add( new JLabel("This is Progress Dialog"), BorderLayout.CENTER); 
      progressDialog.getContentPane().add( new JButton(new AbstractAction("click to progress") { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        progress.setValue(progress.getValue()+25); 
       } 
      }), BorderLayout.SOUTH); 
      progressDialog.setVisible(true); 
     } 

    } 

} 
+0

我知道'WinOS上金属或Nimbus L&F的作品,请将'progress.setValue(current + 1);'包裹在'invokeLater'中 – mKorbel 2013-02-18 13:26:17

+0

当然是: ) – oliholz 2013-02-18 13:34:15

+1

这是不是创建第二个线程?使用javax.swing.Timer不是更好吗? – MadProgrammer 2013-02-18 19:09:03

相关问题