代码之家  ›  专栏  ›  技术社区  ›  Leo Izen

JComponent.revalidate()在代码完成之前不会更新

  •  0
  • Leo Izen  · 技术社区  · 15 年前

    **你好,我正在尝试用java创建一个archiver。这意味着我不断地从溪流中阅读和写作。我想能够更新一个JProgressBar来显示我写了多少。我的代码当前会在存档中的每个条目之后更新进度条。我的变量和所有的东西都说代码被更新了,只是它没有显示在屏幕上。每次进入归档文件后,我都会在包含进度条和文本的JPanel上调用revalidate()方法,但屏幕上什么也没有发生。直到写入存档的输出流完成写入,屏幕才会更新。然后,我看到完整的进度条,进度文本中有“24个文件中的24个已写入”。

    有人能告诉我如何在代码执行完毕之前更新图形吗?桑克斯

    这是我的密码:

    package org.apache.commons.compress;
    import javax.swing.JDialog;
    public class WritingBox extends javax.swing.JDialog {
    
    /** Creates new form WritingBox */
    public WritingBox(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        theprogressbar.setMaximum(1);
        theprogressbar.setMinimum(0);
        this.setLocation(parent.getLocationOnScreen().x+(parent.getWidth()-this.getWidth())/2, parent.getLocationOnScreen().y+(parent.getHeight()-this.getHeight())/2);
        this.setVisible(true);
    }
    public void progressListener(Progress p) {
        writtenxoutofx.setText("Written "+Integer.toString(p.doneSoFar)+" out of "+Integer.toString(p.total)+" files to the Archive");
        theprogressbar.setValue(p.doneSoFar/p.total);
        if (p.doneSoFar == p.total) this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        thecontainer.revalidate();
    };
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
    
        thecontainer = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        writtenxoutofx = new javax.swing.JLabel();
        theprogressbar = new javax.swing.JProgressBar();
    
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setName("Form"); // NOI18N
    
        thecontainer.setName("thecontainer"); // NOI18N
    
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(targzipmanager.TarGzipManagerApp.class).getContext().getResourceMap(WritingBox.class);
        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N
    
        writtenxoutofx.setText(resourceMap.getString("writtenxoutofx.text")); // NOI18N
        writtenxoutofx.setName("writtenxoutofx"); // NOI18N
    
        theprogressbar.setName("theprogressbar"); // NOI18N
    
        javax.swing.GroupLayout thecontainerLayout = new javax.swing.GroupLayout(thecontainer);
        thecontainer.setLayout(thecontainerLayout);
        thecontainerLayout.setHorizontalGroup(
            thecontainerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(thecontainerLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(thecontainerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(theprogressbar, javax.swing.GroupLayout.DEFAULT_SIZE, 307, Short.MAX_VALUE)
                    .addComponent(jLabel1)
                    .addComponent(writtenxoutofx))
                .addContainerGap())
        );
        thecontainerLayout.setVerticalGroup(
            thecontainerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(thecontainerLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(writtenxoutofx)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(theprogressbar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(thecontainer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(thecontainer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
    
        pack();
    }// </editor-fold>
    
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel thecontainer;
    private javax.swing.JProgressBar theprogressbar;
    private javax.swing.JLabel writtenxoutofx;
    // End of variables declaration
    
    }
    

    package org.apache.commons.compress;
    
    public class Progress { //This is basically a Struct
    public int total;
    public int doneSoFar;
    private Progress (){
    
    }
    public Progress(int d, int t){
        total = t;
        doneSoFar = t;
    }
    }
    

    java:doSave方法

    public void doSave(OutputStream output) throws ArchiveException {
            // Stream initializing
            //BufferedInputStream origin = null;
    
            //out.setMethod(ZipOutputStream.DEFLATED);
            //byte data[] = new byte[BUFFER];
    
            // get a list of files from current directory
            // less than one file leads to an exception
            Iterator iterator = this.getEntryIterator();
            if(!iterator.hasNext()) {
                  throw new ArchiveException("There must be at least one file to be pack.");
            }
            JFrame jf = targzipmanager.TarGzipManagerApp.getApplication().getMainFrame();
            WritingBox wb = new WritingBox(jf, false);
            TarOutputStream out = null;
            int x = 0;
            try {
                  out = new TarOutputStream(new BufferedOutputStream(output));
                  while(iterator.hasNext()) {
                        x++;
                        ArchiveEntry archiveEntry = (ArchiveEntry)iterator.next();
                        InputStream fInputStream = archiveEntry.getStream();
    
                        TarEntry entry = new TarEntry(archiveEntry.getName());
                        entry.setModTime( 0 );
                    entry.setSize( fInputStream.available() );
                    entry.setUserID( 0 );
                    entry.setGroupID( 0 );
                    entry.setUserName( "avalon" );
                    entry.setGroupName( "excalibur" );
                    entry.setMode( 0100000 );
                    out.putNextEntry( entry );
                    out.copyEntryContents( fInputStream );
                    out.closeEntry();
                    wb.progressListener(new Progress(x, entries.size()));
                  }
            } catch (IOException e) {
                  throw new ArchiveException("Creation of this archive failed cause of IOExceptions.", e);
            } finally {
                  try {
                        out.close();
                  } catch (IOException e1) {
                        throw new ArchiveException("Creation of this archive failed cause of IOExceptions.", e1);
                  }
            }
      }
    

    1 回复  |  直到 15 年前
        1
  •  1
  •   Tom Hawtin - tackline    15 年前

    听起来像是在AWT事件调度线程(EDT)上执行文件I/O。这将阻止任何重绘或事件处理。在不同的线程上运行I/O,并通过更新GUI java.awt.EventQueue.invokeLater .