2014-09-15 4 views
-1

Я хочу добавить JProgressBar при загрузке файла. Я написал код для этого. Он работает. Но раньше я использовал метод BufferedReader и setText() для JTextArea для загрузки a файл, в этом случае потребовалось 6 секунд для загрузки текстового файла 44 МБ. Теперь я использую FileInputStream для чтения данных ProgressMonitorInputStream для отображения индикатора выполнения. В этом случае потребовалось 17 секунд времени для загрузки файла с 44 МБ. Как я могу решить эту проблему и Я хочу добавить индикатор Progress в свой кадр в левом нижнем углу. Пожалуйста, проверьте его и дайте мне предложения.Как добавить панель JProgress в левом нижнем углу кадра

Мой рабочий код:

public class ProgressbarAction extends javax.swing.JFrame implements Runnable { 
JTextArea textArea; 
int i=0; 
JScrollPane scrollPane; 
JTextField statusBar; 
public ProgressbarAction() { 
    initComponents(); 
} 

@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    tabbedPane = new javax.swing.JTabbedPane(); 
    fileMenubar = new javax.swing.JMenuBar(); 
    fileMenu = new javax.swing.JMenu(); 
    open = new javax.swing.JMenuItem(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    fileMenu.setText("File"); 

    open.setText("Open"); 
    open.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      openActionPerformed(evt); 
     } 
    }); 
    fileMenu.add(open); 

    fileMenubar.add(fileMenu); 

    setJMenuBar(fileMenubar); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE) 
    ); 

    pack(); 
}// </editor-fold>       

private void updateStatus(int linenumber, int columnnumber) { 
    statusBar.setText("Line: " + linenumber +" "+ " Column: " + columnnumber); 
} 
Thread athread; 
private void openActionPerformed(java.awt.event.ActionEvent evt) {          
    athread = new Thread (this); 
    athread.start(); 
}          
public void run(){ 
    FileDialog fd = new FileDialog(ProgressbarAction.this, "Select File", FileDialog.LOAD); 
    fd.setVisible(true); 
    String title; 
    if (fd.getFile() != null) { 
     title=fd.getFile(); 
     File file=new File(fd.getDirectory() + fd.getFile()); 
     final JInternalFrame internalFrame = new JInternalFrame("",true,true); 
     textArea = new JTextArea(); 
     textArea.setFont(new java.awt.Font("Miriam Fixed", 0, 13)); 
     i+=1; 
     internalFrame.setName("Doc "+i); 
     scrollPane=new JScrollPane(textArea); 
     scrollPane.setPreferredSize (new Dimension(350,350)); 
     internalFrame.add(scrollPane,BorderLayout. CENTER); 
     internalFrame.setTitle(title); 
     tabbedPane.add(internalFrame); 
     internalFrame.setVisible(true); 
     FileInputStream inputStream = null; 
     try { 
      inputStream = new FileInputStream (file); 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(ProgressbarAction.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     ProgressMonitorInputStream pmInputStream = new 
     ProgressMonitorInputStream (this," get file ... ", inputStream); 
     ProgressMonitor pMonitor = 
     pmInputStream.getProgressMonitor(); 
     pMonitor.setMillisToDecideToPopup (0); 
     final Scanner in = new Scanner(pmInputStream); 
     textArea.setText(""); 
     while (in.hasNextLine()) { 
      String line = in.nextLine(); 
      textArea.append(line+"\n"); 
     } 
     if(pMonitor.isCanceled()) { 
      textArea.append ("\n \n read files interrupt"); 
     } 
     in.close(); 
     textArea.setCaretPosition(0); 
    } 
} 
public static void main(String args[]) { 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(ProgressbarAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(ProgressbarAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(ProgressbarAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(ProgressbarAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new ProgressbarAction().setVisible(true); 
     } 
    }); 
}     
private javax.swing.JMenu fileMenu; 
private javax.swing.JMenuBar fileMenubar; 
private javax.swing.JMenuItem open; 
private javax.swing.JTabbedPane tabbedPane;     
} 
+0

Пожалуйста, предоставляет информацию, о том, что вы были предупреждены заранее, и как вы пытались выполнить эту штуковину. По крайней мере небольшое представление о ваших усилиях, поможет всем нам знать, где именно вы ошибаетесь !!!! –

+0

В моей программе я использую textArea.setText (текст), Как я могу узнать, сколько данных загружено. Этого я хочу. – user3912886

+1

См. [Как использовать мониторы прогресса] (http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html#monitors) и возвращайтесь к нам, если у вас есть какие-либо проблемы .. с помощью ** код **, который имеет проблему. Голосование закрывается как «слишком широкое». –

ответ

1

Выполнение tx.setText() метод только принимает, чтобы загрузить файл.

Не используйте метод setText().

Вместо этого вы должны использовать метод read(...), предоставляемый API JTextArea, который наследует метод от JTextCompnent.

Затем вы можете использовать InputStreamReader с ProgressMonitorInputStream для чтения файла.

Edit:

Простого SSCCE для чтения файла:

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import javax.swing.*; 
import javax.swing.text.*; 

class TextAreaLoad 
{ 
    private static void createAndShowGUI() 
    { 
     final JTextArea edit = new JTextArea(30, 60); 

     JButton read = new JButton("Read TextAreaLoad.txt"); 
     read.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       try 
       { 
        FileInputStream fis = new FileInputStream("TextAreaLoad.txt"); 
        InputStreamReader reader = new InputStreamReader(fis); 
        BufferedReader br = new BufferedReader(reader); 
        edit.read(br, null); 
        br.close(); 
        edit.requestFocus(); 
       } 
       catch(Exception e2) { System.out.println(e2); } 
      } 
     }); 
     JFrame frame = new JFrame("TextArea Load"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(edit), BorderLayout.NORTH); 
     frame.add(read, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

Я редактирую свой код с помощью метода read(). В методе JTextArea read() также выполняется один шаг для чтения файла .how может предоставить логику для JProgressBar. Предоставьте решение для этого. – user3912886

+0

Также проверьте вторую проблему. – user3912886

+0

@ user3912886 для примера рассмотрим API-интерфейс ProgressMonitorInputStream. Поскольку для метода read (...) требуется «Reader», вам нужно будет использовать «InputStreamReader». – camickr

Смежные вопросы