user2495419
user2495419

Reputation: 1

Can't access variables for SwingWorker

I am trying to get this SwingWorker to function correctly. However,the variables that need to be accessed seem to be not global. What do I do? I tried adding static but it creates more errors and complications later about accessing static from non static. The variables that are not working in the SwingWorker are the LOCAL_FILE and URL_LOCATION variables.

package professorphysinstall;

//Imports
import com.sun.jmx.snmp.tasks.Task;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingWorker;
import javax.tools.FileObject;
import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.ISequentialOutStream;
import net.sf.sevenzipjbinding.ISevenZipInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
import org.apache.commons.vfs2.AllFileSelector;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.VFS;

public class ProfessorPhysInstall {

/**
 * @param args the command line arguments
 */

static class Global {
   public String location;
}

public static void main(String[] args) {
    // TODO code application logic here
    //Variables
    final JFrame mainframe = new JFrame();
    mainframe.setSize(500, 435);
    final JPanel cards = new JPanel(new CardLayout());
    final CardLayout cl = (CardLayout)(cards.getLayout());
    mainframe.setTitle("Future Retro Gaming Launcher");
    //Screen1
    JPanel screen1 = new JPanel();
    JTextPane TextPaneScreen1 = new JTextPane();
    TextPaneScreen1.setEditable(false);
    TextPaneScreen1.setBackground(new java.awt.Color(240, 240, 240));
    TextPaneScreen1.setText("Welcome to the install wizard  for Professor Phys!\n\nPlease agree to the following terms and click the next button to continue.");
    TextPaneScreen1.setSize(358, 48);
    TextPaneScreen1.setLocation(0, 0);
    TextPaneScreen1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
    TextPaneScreen1.setMargin(new Insets(4,4,4,4));
    screen1.add(TextPaneScreen1);
    JTextArea TextAreaScreen1 = new JTextArea();
    JScrollPane sbrText = new JScrollPane(TextAreaScreen1);
    TextAreaScreen1.setRows(15);
    TextAreaScreen1.setColumns(40);
    TextAreaScreen1.setEditable(false);
    TextAreaScreen1.setText("stuff");
    TextAreaScreen1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
    TextAreaScreen1.setMargin(new Insets(4,4,4,4));
    screen1.add(sbrText);
    final JCheckBox Acceptance = new JCheckBox();
    Acceptance.setText("I Accept The EULA Agreenment.");
    screen1.add(Acceptance);
    final JButton NextScreen1 = new JButton();
    NextScreen1.setText("Next");
    NextScreen1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            if(Acceptance.isSelected())
                cl.next(cards);
        }
    });      
    screen1.add(NextScreen1);        
    JButton CancelScreen1 = new JButton();
    CancelScreen1.setText("Cancel");
    CancelScreen1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.exit(0);
        }
    });      
    screen1.add(CancelScreen1);
    cards.add(screen1);

    //Screen2
    final JPanel screen2 = new JPanel();
    JPanel screen3 = new JPanel();
    JTextPane TextPaneScreen2 = new JTextPane();
    TextPaneScreen2.setEditable(false);
    TextPaneScreen2.setBackground(new java.awt.Color(240, 240, 240));
    TextPaneScreen2.setText("Please select the Future Retro Gaming Launcher. Professor Phys will be installed there.");
    TextPaneScreen2.setSize(358, 48);
    TextPaneScreen2.setLocation(0, 0);
    TextPaneScreen2.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
    TextPaneScreen2.setMargin(new Insets(4,4,4,4));
    screen2.add(TextPaneScreen2);
    JLabel screen2instructions = new JLabel();
    screen2instructions.setText("Launcher Location: ");
    screen2.add(screen2instructions);
    final JTextField folderlocation = new JTextField(25);
    screen2.add(folderlocation);
    final JButton Browse = new JButton();
    final JLabel filelocation = new JLabel();
    final JLabel filename = new JLabel();
    Browse.setText("Browse");
    Browse.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            //Create a file chooser
            JFileChooser fc = new JFileChooser();
            fc.showOpenDialog(screen2);
            folderlocation.setText(fc.getSelectedFile().getAbsolutePath());
            filelocation.setText(fc.getCurrentDirectory().getAbsolutePath());
            filename.setText(fc.getSelectedFile().getName());
        }
    });   
    screen2.add(filelocation);
    screen2.add(filename);
    screen3.add(filelocation);
    filelocation.setVisible(false);
    filename.setVisible(false);
    screen2.add(Browse);
    final JButton BackScreen2 = new JButton();
    BackScreen2.setText("Back");
    BackScreen2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            if(Acceptance.isSelected())
                cl.previous(cards);
        }
    });    
    screen2.add(BackScreen2);     
    final JButton NextScreen2 = new JButton();
    NextScreen2.setText("Next");
    NextScreen2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            //Checking Code
            String correctname = "Future_Retro_Gaming_Launcher.jar";
    if (filename.getText().equals(correctname))
    {
        cl.next(cards);
    }
    else
    {
        JFrame popup = new JFrame();
        popup.setBounds(0, 0, 380, 100);
        Label error = new Label();
        error.setText("Sorry you must select your Future_Retro_Gaming_Launcher.jar");
        popup.add(error);
        popup.show();
    }
        }
    });      
    screen2.add(NextScreen2);        
    JButton CancelScreen2 = new JButton();
    CancelScreen2.setText("Cancel");
    CancelScreen2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.exit(0);
        }
    });      
    screen2.add(CancelScreen2);
    cards.add(screen2);
    //Screen3
    JTextPane TextPaneScreen3 = new JTextPane();
    TextPaneScreen3.setEditable(false);
    TextPaneScreen3.setBackground(new java.awt.Color(240, 240, 240));
    TextPaneScreen3.setText("Professor Phys will be instaleld in the directory you have chosen. Please make sure\nyour launcher is in that folder or the game will not work.\nClick next to begin the install process.");
    TextPaneScreen3.setSize(358, 48);
    TextPaneScreen3.setLocation(0, 0);
    TextPaneScreen3.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black),BorderFactory.createEmptyBorder(5, 5, 5, 5)));
    TextPaneScreen3.setMargin(new Insets(4,4,4,4));
    screen3.add(TextPaneScreen3);
    final JButton BackScreen3 = new JButton();
    BackScreen3.setText("Back");
    BackScreen3.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            if(Acceptance.isSelected())
                cl.previous(cards);
        }
    });    
    screen3.add(BackScreen2);     
    final JButton NextScreen3 = new JButton();
    NextScreen3.setText("Next");
    NextScreen3.addActionListener(new ActionListener() {
        @Override
        @SuppressWarnings({"null", "ConstantConditions"})
        public void actionPerformed(ActionEvent ae) {
            //ProgressBar/Install
            System.out.println("FILELOCATION:\n----------");
            System.out.println(filelocation.getText());
            String URL_LOCATION = "https://dl.dropboxusercontent.com/u/10429987/Future%20Retro%20Gaming/ProfessorPhys.iso";
            String LOCAL_FILE = (filelocation.getText() + "\\ProfessorPhys\\");
            System.out.println("LOCALFILE:\n-------");
            System.out.println(LOCAL_FILE);


            RandomAccessFile randomAccessFile = null;
    ISevenZipInArchive inArchive = null;
    try {
        randomAccessFile = new RandomAccessFile(LOCAL_FILE+"professorphys.iso", "r");
        inArchive = SevenZip.openInArchive(null, // autodetect archive type
                new RandomAccessFileInStream(randomAccessFile));

        // Getting simple interface of the archive inArchive
        ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();

        System.out.println("   Hash   |    Size    | Filename");
        System.out.println("----------+------------+---------");

        for (ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {
            final int[] hash = new int[] { 0 };
            if (!item.isFolder()) {
                ExtractOperationResult result;

                final long[] sizeArray = new long[1];
                result = item.extractSlow(new ISequentialOutStream() {
                    public int write(byte[] data) throws SevenZipException {
                        hash[0] ^= Arrays.hashCode(data); // Consume data
                        sizeArray[0] += data.length;
                        return data.length; // Return amount of consumed data
                    }
                });
                if (result == ExtractOperationResult.OK) {
                    System.out.println(String.format("%9X | %10s | %s", // 
                            hash[0], sizeArray[0], item.getPath()));
                } else {
                    System.err.println("Error extracting item: " + result);
                }
            }
        }
    } catch (Exception e) {
        System.err.println("Error occurs: " + e);
        System.exit(1);
    } finally {
        if (inArchive != null) {
            try {
                inArchive.close();
            } catch (SevenZipException e) {
                System.err.println("Error closing archive: " + e);
            }
        }
        if (randomAccessFile != null) {
            try {
                randomAccessFile.close();
            } catch (IOException e) {
                System.err.println("Error closing file: " + e);
            }
        }
    }
}

    });        
    screen3.add(NextScreen3);        
    JButton CancelScreen3 = new JButton();
    CancelScreen3.setText("Cancel");
    CancelScreen3.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.exit(0);
        }
    });      
    screen3.add(CancelScreen3);

    System.out.println("Done");
    JProgressBar progress = new JProgressBar();
    progress.setIndeterminate(true);
    screen3.add(progress);
    cards.add(screen3);
    mainframe.add(cards);
    mainframe.setVisible(true);
}
}

class DownloadWorker extends SwingWorker<Integer, Integer>
{
protected Integer doInBackground() throws Exception
{
    try {
            URL website = new URL(URL_LOCATION);
            ReadableByteChannel rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(LOCAL_FILE+"\\ProfessorPhys.iso\\");
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            System.out.println("--------\nDone Downloading\n---------");
            } catch (Exception e) {
                System.err.println(e);
            }
    return 42;
}

protected void done()
{
    try
    {
        System.out.println("done");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

Upvotes: 0

Views: 1011

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

Your program is mostly a huge static main method. You're kind of getting the cart in front of the horse trying to do advanced programming such as with SwingWorker before first creating clean OOP code. In other words -- start over and do it right. Then the connections between classes will be much more natural and it will be much easier to get things to work right. The main method should only concern itself with starting the Swing event thread, creating a GUI object in that thread, and displaying it. Everything else should be in classes that create objects.

Also, on a more practical level, you have yet to tell us what variables are causing you trouble or what errors you might be seeing. Also, where are you trying to create and execute the SwingWorker?


Edit

One tip that will likely help: Give your SwingWorker class a constructor, and pass important parameters into your SwingWorker object via constructor parameters. Then use those parameters to initialize class fields that will be used in the SwingWorker's doInBackground method.

e.g.,

class DownloadWorker extends SwingWorker<Integer, Integer>
{
private String urlLocation;
private String localFile;

public DownLoadWorker(String urlLocation, String localFile) {
  this.urlLocation = urlLocation;
  this.localFile = localFile;
}


protected Integer doInBackground() throws Exception
{
    try {
            URL website = new URL(urlLocation);
            ReadableByteChannel rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(localFile +"\\ProfessorPhys.iso\\");
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            System.out.println("--------\nDone Downloading\n---------");
            } catch (Exception e) {
                System.err.println(e);
            }
    return 42;
}

protected void done()
{
    try
    {
        System.out.println("done");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

Upvotes: 2

Related Questions