A frame with a text area to show the contents of a file inside a ZIP archive
/*
This program is a part of the companion code for Core Java 8th ed.
(http://horstmann.com/corejava)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
/**
* @version 1.32 2007-06-22
* @author Cay Horstmann
*/
public class ZipTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
ZipTestFrame frame = new ZipTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* A frame with a text area to show the contents of a file inside a ZIP archive, a combo box to
* select different files in the archive, and a menu to load a new archive.
*/
class ZipTestFrame extends JFrame
{
public ZipTestFrame()
{
setTitle("ZipTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// add the menu and the Open and Exit menu items
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("File");
JMenuItem openItem = new JMenuItem("Open");
menu.add(openItem);
openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
int r = chooser.showOpenDialog(ZipTestFrame.this);
if (r == JFileChooser.APPROVE_OPTION)
{
zipname = chooser.getSelectedFile().getPath();
fileCombo.removeAllItems();
scanZipFile();
}
}
});
JMenuItem exitItem = new JMenuItem("Exit");
menu.add(exitItem);
exitItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
});
menuBar.add(menu);
setJMenuBar(menuBar);
// add the text area and combo box
fileText = new JTextArea();
fileCombo = new JComboBox();
fileCombo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
loadZipFile((String) fileCombo.getSelectedItem());
}
});
add(fileCombo, BorderLayout.SOUTH);
add(new JScrollPane(fileText), BorderLayout.CENTER);
}
/**
* Scans the contents of the ZIP archive and populates the combo box.
*/
public void scanZipFile()
{
new SwingWorker<Void, String>()
{
protected Void doInBackground() throws Exception
{
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
while ((entry = zin.getNextEntry()) != null)
{
publish(entry.getName());
zin.closeEntry();
}
zin.close();
return null;
}
protected void process(List<String> names)
{
for (String name : names)
fileCombo.addItem(name);
}
}.execute();
}
/**
* Loads a file from the ZIP archive into the text area
* @param name the name of the file in the archive
*/
public void loadZipFile(final String name)
{
fileCombo.setEnabled(false);
fileText.setText("");
new SwingWorker<Void, Void>()
{
protected Void doInBackground() throws Exception
{
try
{
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
ZipEntry entry;
// find entry with matching name in archive
while ((entry = zin.getNextEntry()) != null)
{
if (entry.getName().equals(name))
{
// read entry into text area
Scanner in = new Scanner(zin);
while (in.hasNextLine())
{
fileText.append(in.nextLine());
fileText.append("\n");
}
}
zin.closeEntry();
}
zin.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
protected void done()
{
fileCombo.setEnabled(true);
}
}.execute();
}
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 300;
private JComboBox fileCombo;
private JTextArea fileText;
private String zipname;
}
Related examples in the same category