2016-04-12 20 views
0

Şu anda notları görüntülemek/kaydetmek için küçük bir uygulama üzerinde çalışıyorum. Her notun içeriği, uygulamayı kapattıktan sonra sabit sürücümdeki bir .properties dosyasında saklanır. Uygulamayı tekrar açarsanız, tüm notlar uygulamanın içine yüklenir.Java SwingWorker şimdi modeli güncellemek için

Bu yükleme işlemi devam ederken, işlemin durumunu gösteren bir progressbar içeren bir iletişim kutusu gösteriyorum. Ayrıca, bir GlassPane gösteriyorum, böylece kullanıcı yükleme sırasında GUI veya sandık/kaydetme ile etkileşimde bulunamaz.

public void load() { 

    new Thread() { 
     @Override 
     public void run() { 
      Properties data = new Properties(); 
      FileInputStream iStream = null; 
      File[] files = sortPairs(); 
      int fileIndex = -1; 

      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        pnlGlass = new MyGlassPane(); 
        infoText = new JTextField(); 
        progBar = new JProgressBar(0,100); 
        progBar.setValue(0); 
        progBar.setStringPainted(true); 
        infoBox = new LoadInfoDialog(infoText,progBar); 
        infoBox.setLocationRelativeTo(gui); 
        infoBox.setVisible(true); 
        infoBox.setDefaultCloseOperation(infoBox.DO_NOTHING_ON_CLOSE); 
        pnlGlass.setOpaque(false); 
        pnlGlass.addMouseListener(new MouseAdapter() { 
         @Override 
         public void mousePressed(MouseEvent me) { 
          me.consume(); 
         } 
        }); 
        gui.setGlassPane(pnlGlass); 
        pnlGlass.setVisible(true); 
        pnlGlass.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
       } 

      }); 
      for (File file : files) { 
       if (file.isFile()) { 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 
        try { 
         iStream = new FileInputStream(file); 
         data.load(iStream); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
         if (!(iStream == null)) { 
          try { 
           iStream.close(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
        String title = data.getProperty("title"); 
        String text = data.getProperty("text"); 
        String erstellt = data.getProperty("date"); 
        String fileName = data.getProperty("filename"); 
        Note note = new Note(text, title); 
        note.setFileName(fileName); 
        note.setDate(erstellt); 
        fileIndex++; 
        final int fileIndexFinal = fileIndex; 
        SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          progBar.setValue(progBar.getValue() + 100/fileCount); 


          infoText.setText("Lade Notizen, bitte warten..." + progBar.getValue() + "%"); 
          noteModel.addNote(note); 
          System.out.println("Index:" + fileIndexFinal); 
         } 

        }); 

       } 
      } 
      SwingUtilities.invokeLater(new Runnable() { 

       @Override 
       public void run() { 
        pnlGlass.setVisible(false); 
        infoBox.setVisible(false); 

       } 
      }); 
     } 
    }.start(); 

} 

benim çözüm oldukça dağınık olduğundan eminim:

takiben notlarını yüklenmesi için benim şimdiki Kod olduğunu. Bazı araştırmalardan sonra tam olarak bu amaçla "SwingWorker" adında bir sınıf olduğunu anladım (arka planda Taks çalıştıran ve gui'yi güncelleyen) AMA, SwingWorker içinden notumu nasıl oluşturabilirim (Modelime Not-Nesne ekle)?

Yayınlama ve işlem yöntemlerini kullanarak ilerleme çubuğumu güncelleyebileceğimi biliyorum, ancak SwingWorker'ı kullanarak bir nesneyi nasıl oluşturabilirim?

yükleme işlemi her not için aşağıdaki rutin yapmalıdır: .properties dosyadan

Okuma içeriği -> not Nesnesi -> JList içinde gösteri notu -> güncelleme progressbar. çekirdek işçi tanımlayarak

+0

Yüklenen notu "yayınlamak için" yayınla "/" işlemini "kullanın, ilerleme için bir" PropertyChangeListener "monitörü kullanmayın – MadProgrammer

+0

Lütfen [Swing Worker Trail] (https://docs.oracle.com/javase/tutorial/ adresini ziyaret edin) uiswing/concurrency/simple.html) – Sanjeev

cevap

1

Başlat ...

public class NotesLoader extends SwingWorker<List<Properties>, Properties> { 

    @Override 
    protected List<Properties> doInBackground() throws Exception { 
     List<Properties> notes = new ArrayList<>(25); 
     File[] files = new File(".").listFiles(new FilenameFilter() { 
      @Override 
      public boolean accept(File dir, String name) { 
       return name.toLowerCase().endsWith(".properties"); 
      } 
     }); 

     for (File file : files) { 
      int count = 0; 
      try (Reader reader = new FileReader(file)) { 
       Properties note = new Properties(); 
       note.load(reader); 

       notes.add(note); 
       publish(note); 
       setProgress((int) ((count/(double) files.length) * 100d)); 
      } 
     } 

     return notes; 
    } 

} 

Bu basit taramalar .properties dosyalar için geçerli çalışma dizinini ve teker teker yüklenmeye çalışıyor. Biri yüklendiğinde, publish yöntemiyle gönderilir ve ilerleme setProgress yöntemi ile güncellenir.

Şimdi, şöyle bir basit ilerleme paneli ...

public class LoadingPane extends JPanel { 

    private JLabel label; 
    private JProgressBar pb; 

    public LoadingPane() { 
     setLayout(new GridBagLayout()); 
     setOpaque(false); 

     label = new JLabel("Loading, please wait"); 
     pb = new JProgressBar(); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     add(label, gbc); 
     add(pb, gbc); 

     addMouseListener(new MouseAdapter() { 
     }); 
     setFocusable(true); 
    } 

    public void setProgress(float progress) { 
     pb.setValue((int) (progress * 100f)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(new Color(128, 128, 128, 128)); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     g2d.dispose(); 
    } 

} 

Bu Şimdi setProgress yöntemi

olduğu gibi, biz yüklemek için birlikte bu ikisini kullanabilirsiniz önemlidir, icat arka planda bulunan notları kaydedin ve UI'yi güncellemeler olarak güvenli bir şekilde güncelleyin.

LoadingPane loadingPane = new LoadingPane(); 
JFrame frame = new JFrame("Testing"); 
frame.setGlassPane(loadingPane); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.add(new JLabel("I'll wait here okay")); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 

NotesLoader loader = new NotesLoader() { 
    @Override 
    protected void process(List<Properties> chunks) { 
     System.out.println(chunks.size() + " notes were loaded"); 
     // Update you model?? 
    } 
}; 
loader.addPropertyChangeListener(new PropertyChangeListener() { 
    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     String name = evt.getPropertyName(); 
     switch (name) { 
      case "state": 
       switch (loader.getState()) { 
        case STARTED: 
         frame.getGlassPane().setVisible(true); 
         frame.getGlassPane().requestFocusInWindow(); 
         break; 
        case DONE: 
         frame.getGlassPane().setVisible(false); 
         try { 
          // Doubt your need the list, but it's good to do this 
          // incase there was an exception which occured during 
          // the running of the worker 
          List<Properties> notes = loader.get(); 
         } catch (InterruptedException | ExecutionException ex) { 
          ex.printStackTrace(); 
          // Maybe show an error message... 
         } 
         break; 
       } 
       break; 
      case "progress": 
       // I like working with normalised values :P 
       loadingPane.setProgress(((int)evt.getNewValue()/100f)); 
       break; 
     } 
    } 
}); 

yüklenmeden gibi notlar alabilirsiniz, ama aynı derecede, sen DONE devlet değişiklikleri kadar beklemek ve hepsini birden alabilir, böylece örnek process yöntemini geçersiz kılar, bu size kalmış

+0

Yardımlarınız için teşekkürler MP. 2 ay önce kodlamaya başladım, bu yüzden API belgelerini okuduktan sonra bile birçok soru işareti var. Ama senin örneğin oldukça iyi ve sanırım şimdi anlıyorum. – Corovus

+0

Bir soru daha var tho. Neden ilerlemeyi 100 ile bölüyorsun ve çarpıyorsun? – Corovus

+0

Normalleştirilmiş bir ilerleme değerinde (0-1) çalışmayı sevdiğim için, bu konsepte göre çok fazla kodum var ama Java, 1-100 – MadProgrammer

İlgili konular