package SwingWorkerTest; import java.awt.BorderLayout; 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.Scanner; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * In acest frame se cintine TextArea, pentru afisarea continutului uni fisier,menu * - care permite sa deschizi fisier sau sai dai cancel la procesul de incarcare * ,si cimpului de statuc,in care se afiseaza procesul de incarcare. * @author Dan * */ public class SwingWorkerFrame extends JFrame { /** * */ private static final long serialVersionUID = 1L; public SwingWorkerFrame() { setTitle("SwingWorkerFrame"); chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(".")); textArea = new JTextArea(); add(new JScrollPane(textArea)); setSize(WIDTH, HEIGHT); statusLine = new JLabel(); add(statusLine, BorderLayout.SOUTH); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu menu = new JMenu("File"); menuBar.add(menu); openItem = new JMenuItem("Open"); menu.add(openItem); openItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub //Fereastra de dialog pentru alegerea fisierului int result = chooser.showOpenDialog(null); //Daca fisierul este ales,se afiseaza pictograma if(result == JFileChooser.APPROVE_OPTION) { readFile(chooser.getSelectedFile()); } } }); cancelItem = new JMenuItem("Cancel"); menu.add(cancelItem); cancelItem.setEnabled(false); cancelItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(workerThread != null) workerThread.interrupt(); } }); } /** * Citirea fisierului in regim asihrin, in process citirea face refresh la interfata. */ public void readFile(final File file) { Runnable task = new SwingWorkerTask() { public void init() { lineNumber = 0; openItem.setEnabled(false); cancelItem.setEnabled(true); } public void update() { statusLine.setText("" + lineNumber); } public void finish() { workerThread = null; openItem.setEnabled(true); cancelItem.setEnabled(false); } public void work() { try { Scanner in = new Scanner(new FileInputStream(file)); textArea.setText(""); while(!Thread.currentThread().isInterrupted() && in.hasNextLine()) { lineNumber++; line = in.nextLine(); textArea.append(line); textArea.append("\n"); doUpdate(); } } catch(IOException e) { JOptionPane.showMessageDialog(null, "" + e); } } private String line; private int lineNumber; }; workerThread = new Thread(task); workerThread.start(); } public static final int WIDTH = 400; public static final int HEIGHT = 200; private Thread workerThread; private JFileChooser chooser; private JTextArea textArea; private JLabel statusLine; private JMenuItem openItem; private JMenuItem cancelItem; }