Visualizzazione dei risultati da 1 a 6 su 6

Discussione: (java) Thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) Thread

    Ho un editor di testo fatto in java.
    Il testo viene visualizzato all'interno di un jtextpane
    Quando leggo da filesystem un file di testo e lo voglio visualizzare con il mio editor, faccio comparire una jprogressbar di attesa caricamento file.
    Quando arrivo all'istruzione
    editor.setText(text);
    dove editor è il mio jtextpane e text è il testo da visaulizzare a video, il programma si blocca
    Penso sia un problema di comunicazione fra thread, ma non so risolverlo.
    Ho provato anche ad usare le righe

    codice:
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    	public void run() {
    		editor.setText(text);
    	}
    }
    ma il programma si blocca lo stesso.
    Sapete dirmi come risolvere il problema?


    codice:
    public void openFile(String fileName) {
    	final String readFile = fileName;
    	Thread thread = new Thread() {
    		public void run() {
    			try {
    	// open the file, wrapping it in a ProgressMonitorInputStream
    				StringBuffer contents = new StringBuffer();
    				InputStream in = new FileInputStream(readFile);
    				ProgressMonitorInputStream pm =
    						new ProgressMonitorInputStream(
    							frame,
    							"Reading the big file",
    							in);
    				int c = 0;
    				while ((c = pm.read()) != -1) {
    					contents.append((char) c);
    				}
    				pm.close(); 
    				String text = contents.toString();
    					
    				editor.setText(text);
    					
    
    			} catch (Exception ex) {
    				ex.printStackTrace();
    
    			}
    		}
    	};
    	thread.start();
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Invece di implementare il Thread come hai fatto tu, prova a costruirti una classe che estende Thread e passaer al suo costruttore il JEditorPane in modo da poterlo utilizzare al suo interno. Credo che il problema stia nel fatto che il thread non è l'owner del JEditorPane perciò non può usarlo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    Ho fatto come hai detto tu, adesso il programma no si blocca, ed il testo viene visualizzato, ma non compare la jprogressbar di attesa.
    Nel metodo dove devo aprire il file ho scritto:
    codice:
    MyProgressBar m = new MyProgressBar(frame, editor, fileAbsPath);
    m.run();
    La classe MyProgressBar è la seguente:

    codice:
    package it.mditor.listeners.filemenu;
    
    import it.editor.graphics.TextEditor;
    import it.editor.main.BuildEditor;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import javax.swing.ProgressMonitorInputStream;
    
    public class MyProgressBar extends Thread {
    	
    	private BuildEditor frame;
    	TextEditor editor; String fileAbsPath;
    	
    	
    
    	public MyProgressBar (BuildEditor frame, TextEditor editor, String fileAbsPath) {
    		this.frame = frame;
    		this.editor = editor;
    		this.fileAbsPath = fileAbsPath;
    	}
    	
    	public void run() {
    
    		try {
    			// open the file, wrapping it in a ProgressMonitorInputStream
    			StringBuffer contents = new StringBuffer();
    			InputStream in = new FileInputStream(fileAbsPath);
    			ProgressMonitorInputStream pm = new ProgressMonitorInputStream(frame, "Reading the big file", in);
    			int c = 0;
    			while ((c = pm.read()) != -1) {
    				contents.append((char) c);
    			}
    			pm.close();
    			String text = contents.toString();
    
    			editor.setText(text);
    
    		} catch (Exception ex) {
    			ex.printStackTrace();
    
    		}
    
    	}
    
    }

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il perchè non compaia la progress bar non lo so... il modo di utilizzo della ProgressMonitorInputStream sembra corretto.

    Quello che non è affatto corretto è il modo di far partire il thread:
    codice:
    MyProgressBar m = new MyProgressBar(frame, editor, fileAbsPath);
    m.start();
    Se richiami direttamente il metodo run() non fai partire il thread ma esegui, sequenzialmente, le istruzioni del metodo perdendo il "parallelismo".


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    ho messo start invece di run
    la progress bar non compare e quando arrivo all'istruzione
    editor.setText(text);
    il programma si blocca

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    Invece della progressBarInputStream ho provato ad usare JProgressBar.
    Mi compare la dialog con la progress bar che aumenta, ma non mi scrive nulla nell'editor.
    Posto il codice del metodo openFile e
    Le classi LonkTask e SwingWorker sono quelle prese dal sito della sun
    Forse sbaglio il punto in cui chiamo il metodo doRead, forse la sua chiamata va messa dentro la classe LongTask?


    codice:
     OpenAction() {
                super(openAction);
            }
    
            public void actionPerformed(ActionEvent e) {
                Frame frame = getFrame();
                if (fileDialog == null) {
                    fileDialog = new FileDialog(frame);
                }
                fileDialog.setMode(FileDialog.LOAD);
                fileDialog.show();
    
                String file = fileDialog.getFile();
                if (file == null) {
                    return;
                }
                String directory = fileDialog.getDirectory();
                final File f = new File(directory, file);
                if (f.exists()) {
                    Document oldDoc = getEditor().getDocument();
                    if (oldDoc != null)
                        oldDoc.removeUndoableEditListener(undoHandler);
                    if (elementTreePanel != null) {
                        elementTreePanel.setEditor(null);
                    }
                    getEditor().setDocument(new PlainDocument());
                    final Document doc = getEditor().getDocument();
                    frame.setTitle(file);
                    //Thread loader = new FileLoader(f, editor.getDocument());
                    //loader.start();
                    System.out.println("long size: " + f.length());
                    System.out.println("int size: " + (int) f.length());
                    task = new LongTask((int) f.length());
    
                    //Create the demo's UI.
    
                    progressBar = new JProgressBar(0, task.getLengthOfTask());
                    progressBar.setValue(0);
                    progressBar.setStringPainted(true);
    
                    taskOutput = new JTextArea(5, 20);
                    taskOutput.setMargin(new Insets(5, 5, 5, 5));
                    taskOutput.setEditable(false);
                    taskOutput.setCursor(null); //inherit the panel's cursor
                    //see bug 4851758
    
                    final JDialog dialog = new JDialog(frame, "Loading text file", true);
                    JPanel panel = new JPanel();
    
                    panel.add(progressBar);
    
                    dialog.getContentPane().add(panel, BorderLayout.PAGE_START);
                    dialog.getContentPane().add(new JScrollPane(taskOutput), BorderLayout.CENTER);
                    //dialog.setBorder(BorderFactory.createEmptyBorder(20, 20, 20,
                    // 20));
    
                    //Create a timer.
                    timer = new Timer(ONE_SECOND, new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            progressBar.setValue(task.getCurrent());
                            String s = task.getMessage();
                            if (s != null) {
                                taskOutput.append(s + newline);
                                taskOutput.setCaretPosition(taskOutput.getDocument().getLength());
    
                            }
                            if (task.isDone()) {
                                Toolkit.getDefaultToolkit().beep();
                                timer.stop();
                                dialog.getContentPane().setCursor(null); //turn off
                                // the wait
                                // cursor
                                progressBar.setValue(progressBar.getMinimum());
                                dialog.dispose();
                            }
                        }
                    });
    
                    dialog.getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                    task.go();
                    timer.start();
    
                    
    
                    dialog.setSize(400, 350);
                    dialog.setVisible(true);
                    
                    Thread t = new Thread() {
                        public void run() {
                        doRead(f, doc);
                        }
                    };
    
                }
            }
            
            private void doRead(File f, Document doc) {
                FileReader fr;
                try {
                    fr = new FileReader(f);
    
                    BufferedReader br = new BufferedReader(fr);
                    String input = br.readLine();
    
                    while (input != null) {
                        input = br.readLine();
                        doc.insertString(doc.getLength(), input, null);
                    }
    
                    br.close();
                } catch (Exception e1) {                  
                    e1.printStackTrace();
                }
            }
    
        }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.