JProgressBar不会从SwingWorker更新,而调试工作正常 - java

这已经让我呆了两天了。我似乎无法正确更新JProgressBar,也不确定为什么。我已经阅读了并发和SwingWorker教程,已经在程序外部进行了测试,并能够使用简单的代码使其正常工作。我理解这些概念,只是不明白为什么它不起作用,因为已经以许多不同的方式重写了代码,但我仍然无法使它起作用。我将使用程序中尽可能多的代码发布SSCE,并在此处尽我所能解释最好的事情。

基本上,我有一个自动更新程序/安装程序,可以向我们的客户计算机更新和/或安装《魔兽世界》插件。 “更新程序”要做的第一件事是检查服务器,以查看其版本是否与服务器上更新程序安装程序的版本相同。这工作顺畅!实际上,除此问题外,整个更新程序都很好用。如果更新程序发现服务器的版本号与更新程序的版本号不同,则从服务器下载安装程序(以zip格式),解压缩,从zip文件中包含的exe开始安装并关闭当前打开的更新程序,因此安装可以正确完成。

因此,我在卡上有一个进度栏(使用cardLayout为更新器显示了三个不同的更新器卡,SelfUpdate,Login和AddonList)。以及JProgressBar下面的JTextArea,这些都显示在特定的SelfUpdate卡上。它在服务器上查询服务器上的版本号,并将该版本与当前安装的更新程序上的版本号进行比较。如果版本相同,则更改为登录卡,然后移至该程序的下一个位,到目前为止,该位都有效,如果版本不同,则它向服务器发送查询,服务器将zip文件发送回更新程序进行处理。

这是行不通的地方。该zip大小合适,我当然想显示下载进度。 zip文件下载工作正常(它在SwingWorker doInBackground()方法中运行),然后更新程序将installer.exe文件解压缩到客户系统驱动器上的文件夹中,使用运行时启动并启动installer.exe,这会弹出安装程序屏幕,然后使用System.exit(0)关闭当前更新程序。同样,所有这些都可以,但是JProgressBar本身不会更新。整件事占0%。另外,taskOutput JTextArea也不更新,但主要问题是进度条未更新。我可以忍受这种修复,而JTextArea不会更新。 (也尝试过使用JLabel代替文本区域,并且没有喜悦)

所以我知道我做错了,但是我无法想象。这是魔术发生的地方。 :)如果我在这里讲解,请原谅我。

因此,Controller.java处理程序的所有流程,这是您需要查看的部分。

// Imports packages needed for use in this file.
import javax.swing.*;
import java.awt.CardLayout;
import java.io.*;
// class instantiation
public class Controller {

// Variables needed for use in this class
private static Updater util;
private static int loginReturnState = 0;
/**
*   Single contructor for this class
*/
public Controller() {

}


/**
*   Main method which runes everything in the updater program
*
*/
public static void main(String[] args) {
    util = new Updater();
    // Schedule a job for the event dispatch thread.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {

            // setup a new GUI
            util.createGUI();
            JFrame rFrame = util.getRootFrame();                
            JPanel gFrame = util.getCardLayoutFrame();
            CardLayout cards = (CardLayout) gFrame.getLayout();
            cards.show(gFrame, "UpdateUpdaterPanel");

            rFrame.pack();
            rFrame.setLocationRelativeTo(null);
            rFrame.setVisible(true);

            SelfUpdater selfUp = new SelfUpdater();             
            int needUpdate = selfUp.checkForUpdate();                                       if (needUpdate == 2) {// Update available for download. Download it.
                selfUp.downloadUpdate();

            } 


        }
    });


}
}

确定下一个文件是Updater类。将代码放入希望可以编译并显示问题的代码中,我需要将此类放入其中,否则将无法调用uPdater类中拥有的实用程序方法,因此我会大量使用它们。

// Packages needed for use in this file
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.CardLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.io.*;


// Class instantiation
public class Updater {

// These final variables are set to the path for each of the images used
public static final String BG_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\background.png";
public static final String APP_ICON_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\app-icon.png";
public static final String CLOSE_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\close.png";
public static final String FINOFF_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\FinishedOff.png";
public static final String FINON_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\FinishedOn.png";
public static final String ICON_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\icon.png";
public static final String ICON64_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\icon64x64.png";
public static final String ICON256_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\icon256x256.png";
public static final String INSTOFF_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\InstallUpdatesOFF.png";
public static final String INSTON_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\InstallUpdatesON.png";
public static final String LOGO_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\logo.png";
public static final String MIN_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\minimize.png";
public static final String PROGBACK_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\ProgressBackground.png";
public static final String PROGBAR_IMAGE_PATH = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\ProgressBar.png";
public static final String INSTRUCTIONS_BUTTON = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\instructions.png";
public static final String PURCHASE_BUTTON = "F:\\Java Programs\\Updater\\src\\com\\dynastyaddons\\updater\\images\\Purchase.png";
// These are various final variables for use throughout the updater
public static final String URL_CONNECT = "http://dynastyaddons.com/api/index2.php?";
public static final String TITLE_TEXT = "Dynasty Updater";
public static final int BUFFER_SIZE = 4096;
public static final double UPDATER_VERSION = 1.1;

// Public variables needed for this class workings
private static JFileChooser fc;
private static JFrame rootFrame;

// Private variables for this class use alone
private static String PHPSessionID;
private static boolean debugToggle = true;
private CardLayout cards;
private JPanel guiFrame;
private Point mouseDownCompCoords;
private Login login;
private Addons addons;

/**
*   Sole contructor. (For invocation by subclass contructors, typically implicit.)
*/
public Updater() {
    // First instantiate any variables needed
    PHPSessionID = "notset";
    guiFrame = new JPanel();
    cards = new CardLayout();
    guiFrame.setLayout(cards);
}


// Various methods follow
/**
*   This will create the root gui for showing in the main method
*
*/
public void createGUI() {
    rootFrame = new JFrame();
    SpringLayout rootLayout = new SpringLayout();

    // setup root frame
    rootFrame.setUndecorated(true);
    rootFrame.setBackground(new Color(0,0,0,0));
    rootFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    rootFrame.setPreferredSize(new Dimension(800,600));
    rootFrame.setTitle(TITLE_TEXT);

    // add the background image
    JLabel bg = new JLabel(new ImageIcon(BG_IMAGE_PATH));
    bg.setLayout(rootLayout);
    rootFrame.add(bg);

    // setup title bar
    mouseDownCompCoords = null;
    mouseDownCompCoords = null;
    rootFrame.addMouseListener(new MouseListener() {
        public void mouseReleased(MouseEvent e){ mouseDownCompCoords = null; }
        public void mousePressed(MouseEvent e){ mouseDownCompCoords = e.getPoint(); }
        public void mouseExited(MouseEvent e){}
        public void mouseEntered(MouseEvent e){ }
        public void mouseClicked(MouseEvent e){ }
    });
    rootFrame.addMouseMotionListener(new MouseMotionListener() {
        public void mouseMoved(MouseEvent e){}
        public void mouseDragged(MouseEvent e){
            Point currCoords = e.getLocationOnScreen();
            rootFrame.setLocation(currCoords.x - mouseDownCompCoords.x, currCoords.y - mouseDownCompCoords.y);
        }
    });

    // Display and place the logo
    JLabel logo = new JLabel(new ImageIcon(LOGO_IMAGE_PATH));
    bg.add(logo);

    // add Close and Minimize buttons
    JPanel cmButt = createCloseAndMinButtons();
    bg.add(cmButt);

    // create card frame
    guiFrame.setPreferredSize(new Dimension(800, 435));
    guiFrame.setOpaque(false);
    bg.add(guiFrame);

    // Constrain the parts of your BG
    rootLayout.putConstraint(SpringLayout.WEST, logo, 30, SpringLayout.WEST, rootFrame);
    rootLayout.putConstraint(SpringLayout.NORTH, logo, 70, SpringLayout.NORTH, rootFrame);
    rootLayout.putConstraint(SpringLayout.NORTH, cmButt, 0, SpringLayout.NORTH, rootFrame);
    rootLayout.putConstraint(SpringLayout.EAST, cmButt, 0, SpringLayout.EAST, rootFrame);
    rootLayout.putConstraint(SpringLayout.SOUTH, guiFrame, 0, SpringLayout.SOUTH, rootFrame);
    rootLayout.putConstraint(SpringLayout.WEST, guiFrame, 0, SpringLayout.WEST, rootFrame);
    rootLayout.putConstraint(SpringLayout.EAST, guiFrame, 0, SpringLayout.EAST, rootFrame);


    // Create self updater panel and get it ready to show
    SelfUpdater selfUp = new SelfUpdater();
    JPanel selfUpd = selfUp.getSelfUpdatePanel();

            // get the cardlayout and add the three panels to it, then show the self-updater to begin.

    guiFrame.add(selfUpd, "UpdateUpdaterPanel");    }

/**
*   Creates a panel which has the close and minimize buttons on it.
*/
private static JPanel createCloseAndMinButtons() {
    JPanel a = new JPanel();
    SpringLayout closeLO = new SpringLayout();
    a.setLayout(closeLO);
    a.setPreferredSize(new Dimension(150,150));
    a.setOpaque(false);

    // Close Button
    JButton cButt = new JButton(new ImageIcon(Updater.CLOSE_IMAGE_PATH));
    cButt.setBorderPainted(false);
    cButt.setContentAreaFilled(false);
    cButt.setFocusPainted(false);
    cButt.setOpaque(false);
    cButt.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) { System.exit(0); }
    });
    a.add(cButt);

    // Minimize Button
    JButton mButt = new JButton(new ImageIcon(Updater.MIN_IMAGE_PATH));
    mButt.setBorderPainted(false);
    mButt.setContentAreaFilled(false);
    mButt.setFocusPainted(false);
    mButt.setOpaque(false);
    mButt.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) { rootFrame.setState(JFrame.ICONIFIED); }
    });
    a.add(mButt);

    // Constrain parts on panel
    closeLO.putConstraint(SpringLayout.EAST, cButt, 12, SpringLayout.EAST, a);
    closeLO.putConstraint(SpringLayout.NORTH, cButt, -2, SpringLayout.NORTH, a);
    closeLO.putConstraint(SpringLayout.EAST, mButt, 30, SpringLayout.WEST, cButt);
    closeLO.putConstraint(SpringLayout.NORTH, mButt, -2, SpringLayout.NORTH, a);

    // Return the jframe
    return a;

}

/**
*   Returns the guiFrame which holds the cardlayout for the changing of the panels.
*
*   @return JPanel  Returns the frame which holds the cardlayout.
*/
public JPanel getCardLayoutFrame() {
    return guiFrame; 
}   

/**
*   This will return the cardlayout for use in the controller.
*
*   @return CardLayout  Returns the cardlayout for use in the Controller.
*/
public CardLayout getCardLayout() { return cards; }


/**
*   Returns the current version of this updater as a double
*
*   @return     the version of this updater as a double.
*/
public double getUpdaterVersion() { return UPDATER_VERSION; }

/**
*   Returns a string that tells if the customer is useing windows or mac
*
*   @return     the operating system in use by the customer
*/
public static String getOSType() {
    String retString = "";
    String oST = System.getProperty("os.name").toLowerCase();
    int spacePos = oST.indexOf(" ");
    if (spacePos > 0) {
        retString = oST.substring(0, spacePos);
    }
    retString.trim();
    return retString;
}


/**
*   Returns the main root frame for display purposes in controller.java
*
*   @return JFrame  returns rootFrame.
*/
public JFrame getRootFrame() { return rootFrame; }

}

OK <请记住,此类实际上只是在后台执行一些实用程序,并且除了在后台gui中创建并告诉SelfUpdate卡显示以外,可能不涉及任何其他事情。

最后,这是SelfUpdater.java文件,该文件显示带有进度条的SelfUpdater面板,并执行所有服务器查询,这又可以正常工作。请注意我在downloadUpdate方法(在控制器文件中称为)中包含的System.out.println调试语句,因为它们可以正常工作并且可以在控制台中打印出来,没有问题。该方法中的selfUpdateProgress.setValue(int)和taskOutput.setText(txt)语句不执行任何操作。此外,我还将println放在doInBackground中,在该处它执行setProgress(int)并可以打印到控制台,但工具栏不起作用。用setProgress更新。这里是。

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.zip.*;

// Create and start class
public class SelfUpdater extends JPanel {

// These are the variables needed for use in this class
private JPanel selfUpdatePanel;
private JProgressBar selfUpdateProgress;
private Task task;
private JTextArea taskOutput;
private Updater util;

/**
*   Default class constructor, instantiates variables and sets up GUI.
*
*
**/
public SelfUpdater() {
    // Progress Bar
    selfUpdateProgress = new JProgressBar(0, 100);
    selfUpdateProgress.setValue(0);
    selfUpdateProgress.setStringPainted(true);
    selfUpdateProgress.setPreferredSize(new Dimension(470,29));

    // Layout
    SpringLayout selfUpdateLayout = new SpringLayout();
    SpringLayout pBarLayout = new SpringLayout();


    // Font and color setup for Task Output
    Font myFont = new Font("Serif", Font.BOLD, 16);
    Color myColor = new Color(255, 170, 0);


    // Description of progress pane
    taskOutput = new JTextArea("Checking server for updates to the updater.", 1, 39);
    taskOutput.setFont(myFont);
    taskOutput.setForeground(myColor);
    taskOutput.setEditable(false);
    taskOutput.setOpaque(false); // this is false after setting up the window.

    //extras needed for the class workings
    util = new Updater();

    // Images for progress bar setup
    JLabel pBar = new JLabel(new ImageIcon(util.PROGBACK_IMAGE_PATH));
    pBar.setOpaque(false);
    //pBar.setLayout(pBarLayout);
    //pBar.add(taskOutput);
    //pBar.add(selfUpdateProgress);

    // Main panel
    selfUpdatePanel = new JPanel();
    selfUpdatePanel.setPreferredSize(new Dimension(800, 435));
    selfUpdatePanel.setLayout(selfUpdateLayout);
    selfUpdatePanel.setOpaque(false); 
    selfUpdatePanel.add(taskOutput);
    selfUpdatePanel.add(selfUpdateProgress);
    selfUpdatePanel.add(pBar);  

    // Constrain your bits.
    // First constrain PBar to the self update panel
    selfUpdateLayout.putConstraint(SpringLayout.SOUTH, pBar, -40, SpringLayout.SOUTH, selfUpdatePanel);
    selfUpdateLayout.putConstraint(SpringLayout.WEST, pBar, 150, SpringLayout.WEST, selfUpdatePanel);
    selfUpdateLayout.putConstraint(SpringLayout.SOUTH, taskOutput, -50, SpringLayout.SOUTH, selfUpdatePanel);
    selfUpdateLayout.putConstraint(SpringLayout.WEST, taskOutput, 175, SpringLayout.WEST, selfUpdatePanel);
    selfUpdateLayout.putConstraint(SpringLayout.SOUTH, selfUpdateProgress, -84, SpringLayout.SOUTH, selfUpdatePanel);
    selfUpdateLayout.putConstraint(SpringLayout.WEST, selfUpdateProgress, 171, SpringLayout.WEST, selfUpdatePanel); }

/**
*   Will return the jpanel that contains the gui elements for the Self-Update
*
*   @return JPanel  The Self-Update gui.
*
*/
public JPanel getSelfUpdatePanel() { return selfUpdatePanel; }

/**
*   This will check the server to see if an update is available for the updater
*
*   @return int     Returns an int that will describe the answer from the server.
*                   Possible Return values:
*                   0 = Problem checking for update: Server return NULL
*                   1 = Second type of problem checking for update: Server returned empty string
*                   2 = Update available.
*                   3 = Update not needed.
*
*/
public int checkForUpdate() {
    // ask the server what version it's updater is.
    String serverUpdaterVersion = "";

    try {

        HttpConnect conn = new HttpConnect();
        String urlRequest = util.URL_CONNECT + "action=get_updater&platform=" + util.getOSType();
        serverUpdaterVersion = conn.textRequest(urlRequest, 1);

    } catch (MalformedURLException e) {
        JOptionPane.showMessageDialog(null, "We were unable to connect to the server while checking for an updater update, please check your internet connection.", "Attention!",JOptionPane.ERROR_MESSAGE);            
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "We were unable to open the connection to the server while checking for an updater update, please check your internet connection.", "Attention!",JOptionPane.ERROR_MESSAGE);        
    }

    // check for errors and return proper int.
    if (serverUpdaterVersion == null) { // There is an error if the server returns null, return 0
        return 0;
    } else if (serverUpdaterVersion.equals("")) { // if the server returns an empty string return 1 for an error
        return 1;
    } else { // not null or empty string. check versions
        // Check version of this updater to servers version
        double sVers = Double.parseDouble(serverUpdaterVersion);

        if((double)sVers == util.getUpdaterVersion()) { // return 3 if no update needed here.
            return 3;
        } else { // otherwise return 2 so we can get the update
            return 2;
        }

    }
}

/**
*   This will download the update from the server.
*
*   @return File        The downloaded file from the server. A zip file usually.
*
*/
public void downloadUpdate() {
    // turn on wait cursor
    util.getRootFrame().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    // start a new task which does the download
    // Instances of javax.swing.SwingWorker are not reusuable, so
    // we create new instances as needed.
    task = new Task();
    // add a property listener to the task so it knows to update the progress meter.
    task.addPropertyChangeListener(new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {

            switch(evt.getPropertyName()) {
                case "progress":// set the progress value and the task output value.
                    selfUpdateProgress.setIndeterminate(false);
                    int prg = (Integer) evt.getNewValue();
                    selfUpdateProgress.setValue(prg);
                    taskOutput.setText("Downloading and unzipping update. Progress = " + prg + "%");
                    System.out.println("Percent progress: " + prg + "%");
                    break;
            }
        }
    });
    // execute or start the task.
    task.execute();
}

/**
*   This method will unzip the downloaded file, and start the installation.
*   Then it will close this program while the installation completes.
*
*
*/
public void unzipNewUpdater() {
    // create strings for naming the zip file to open up and where to put it.
    String zipFile = "NewUpdater.zip";
    String outputFolder = System.getenv("SystemDrive") + "\\DynastyAddons";
    // Try the unzipping and catch any errors.
    try {

        // Setup the input stream and get the entry ready to unzip.
        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
        ZipEntry ze = zis.getNextEntry();

        // loop to open each entry and output it to the output folder and file.
        while(ze!=null) {
            // Get the name
            String entryName = ze.getName();

            // get the file to unzip
            File f = new File(outputFolder + File.separator + entryName);

            // Create folders needed to hold the unzipped stuff
            f.getParentFile().mkdirs();

            // get output stream setup to copy the file to from the zip
            FileOutputStream fos = new FileOutputStream(f);

            // get length of file to make sure we get the whole thing moved
            int len;
            byte buffer[] = new byte[1024];

            // loop thru the entry writing the whole file to the output directory
            while((len = zis.read(buffer)) > 0){
                fos.write(buffer, 0, len);
            }

            // close the output stream and get the next entry ready for the next iteration of the loop.
            fos.close();
            ze = zis.getNextEntry();

        }

        // close the entry and input stream since we're done.
        zis.closeEntry();
        zis.close();

    } catch (FileNotFoundException ex) {
        // throw error
    } catch (IOException ex) {
        // throw error
    }
}

// This private class handles the download and unzip of the new updater if needed.
class Task extends SwingWorker<Void, Void> {


    @Override
    public Void doInBackground() {
        try {
            HttpConnect conn = new HttpConnect();
            String downloadURL = util.URL_CONNECT + "action=download_updater&platform=" + util.getOSType();
            conn.downloadFile(downloadURL);

            InputStream inputStream = conn.getInputStream();

            FileOutputStream outputStream = new FileOutputStream(System.getenv("SystemDrive") + "\\DynastyAddons\\NewUpdater.zip");

            byte[] buffer = new byte[util.BUFFER_SIZE];
            int bytesRead = -1;
            long totalBytesRead = 0;
            int percentCompleted = 0;
            long fileSize = conn.getContentLength();

            taskOutput.setText("Downloading Newest Updater.");
            //setProgress(0);

            while ((bytesRead = inputStream.read(buffer)) != -1) {

                outputStream.write(buffer, 0, bytesRead);
                totalBytesRead += bytesRead;
                percentCompleted = (int) (totalBytesRead * 100 / fileSize);
                setProgress(percentCompleted);

            }

            outputStream.close();
            conn.disconnect();

        } catch (IOException ex) {
            JOptionPane.showMessageDialog(util.getRootFrame(), "Error downloading Updater file. Please send this entire error to [email protected]. \n Error: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            setProgress(0);
        }
        return null;
    }

    @Override
    public void done() {
        // Create msg window saying update downloaded.
        JOptionPane.showMessageDialog(util.getRootFrame(), "The new updater has been downloaded. \nClick OK to close this updater and start the installation of the new version.", "Attention", JOptionPane.PLAIN_MESSAGE);

        // Unzip the updater
        unzipNewUpdater();

        // Tell the cursor we're not busy anymore
        setProgress(100);
        selfUpdateProgress.setValue(100);
        taskOutput.setText("Done Downloading New Updater. Installing...");
        util.getRootFrame().setCursor(null);

        // Create command used to open the udpater installer.
        String cmd = "cmd /c " + System.getenv("SystemDrive") + "\\DynastyAddons\\InstallDynastyAddonsUpdater.exe";

        // Here is where we run the exe that will install the new updater.
        try{
            Runtime.getRuntime().exec(cmd);
        }catch (FileNotFoundException ex){
            // handle this error
        }catch (IOException ex) {
            // handle this error
        }

        // Now close this updater so the new one can install.
        System.exit(0);
    }
}

}

我希望,如果您需要查看它们的运行情况,它们都可以正确编译。如果没有,请告诉我,我将进行更新以使它在编译时有效。因此,我尝试了很多事情,使SelfUpdater类实现PropertyChangeListener并实现PropertyChange(event),并尝试将JProgressBar馈送到Task类中的构造函数。我尝试在SwingWorker中输出一个Integer,并使用“发布和处理”来更新taskOutput和JProgressBar,我尝试重新编写整个该死的类以修正代码,并使其更容易找出问题。我已经使用教程和一些代码进行了测试,以使其正常工作(它们工作得很好),但是每次我回到这里的更新程序代码时,该进度条都不会更新。我真的很祈祷有人可以给我一些关于这个问题的见解,这样我就可以结束这个项目并开始一些新的事情!这是我必须修复的最后一件事(除非Mac上有问题),并且我已经完成了,可以返回测试并分发给我们的客户。

我也很乐于对代码的任何部分发表评论(我可能做过的任何愚蠢的事情),我总是在批评我的代码,特别是如果我没有根据良好的设计做某事的话。冻结这里忘记了这个词。当然,如果需要更多信息,我可以轻松地粘贴组成该更新程序的7个类中的所有代码。

一切都可以编译,并且工作正常,除了这个jprogressbar不会显示进度,即使我可以在控制台中将其打印出来。在此先感谢您,为这里的迷你小说感到抱歉,还没有问过一个问题,并且已经能够弄清别人的问题和答案中的所有内容,现在已经迷住了,并准备好了! :D

如果我在此处张贴了一些错误的内容,我事先表示歉意,请记住这是我的第一篇文章,虽然我已经阅读了数百篇文章,但是我敢肯定,我的傻瓜弄乱了某些内容,请随时为我的错误提起公诉这样我可以解决它们。 🙂

编辑更新了selfUpdater.java以反映仅使用一种弹簧布局。

参考方案

您所遇到的是布局问题,与SwingWorker无关。 JProgressBar的更新很好,您看不到它。

检查您的主要方法。您正在创建两个SelfUpdater实例,将其中一个添加到GUI并更新另一个。

public static void main(String[] args) {
    util = new Updater(); // <-- don't do this, it calls Swing code from a thread that is not EDT
    // Schedule a job for the event dispatch thread.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {

            // setup a new GUI
            util.createGUI(); // <-- creates an instance of SelfUpdater and adds it to GUI
            JFrame rFrame = util.getRootFrame();                
            JPanel gFrame = util.getCardLayoutFrame();
            CardLayout cards = (CardLayout) gFrame.getLayout();
            cards.show(gFrame, "UpdateUpdaterPanel");

            rFrame.pack();
            rFrame.setLocationRelativeTo(null);
            rFrame.setVisible(true);

            SelfUpdater selfUp = new SelfUpdater(); // <-- creates another instance             
            int needUpdate = selfUp.checkForUpdate();                                       
            if (needUpdate == 2) {// Update available for download. Download it.
                selfUp.downloadUpdate();

            } 


        }
    });

}

如果未将组件添加到任何地方,则不能期望它们会被显示。 🙂

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…

Java-向Servlet动态添加URL模式 - java

是否可以在运行时动态地将URL模式添加到Servlet?例如,当Servlet启动时,扫描文件夹中的注释,然后将这些URL模式注入到Servlet中?提供更多清晰度-在Servlet的init文件中,我要执行此操作(伪代码)// scan all the files in the package my.project.services // find all…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…