2013-10-13 3 views
0

Я попытался написать простую тестовую программу с помощью Swing, все, что я хочу сделать, это загрузить текстовый файл и отобразить путь к выбранному текстовому файлу в текстовой области. Я продолжаю получать предупреждение о методе процесса, который никогда не использовался локально, и он не добавляет текст в текстовое поле. Может быть, я что-то не понимаю, надеюсь, кто-то может мне помочь.SwingWorker Process() warning

код:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.filechooser.FileNameExtensionFilter; 



public class MyPanel3 extends JPanel{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JTextArea jcomp; 
    private JButton btn; 
    private String testfile; 

    public MyPanel3() { 


     //construct components 
     jcomp = new JTextArea (1, 1); 
     jcomp.setBorder(BorderFactory.createDashedBorder(Color.BLACK)); 
     btn = new JButton ("open"); 

     //adjust size and set layout 
     setPreferredSize (new Dimension (944, 575)); 
     BoxLayout layout = new BoxLayout (this, BoxLayout.Y_AXIS); 
     setLayout(layout); 


     //add main components 
     add (jcomp); 
     add (btn); 


     new SwingWorker<Void, String>(){ 


      protected Void doInBackground(){ 

       //do processes...  
       btn.addActionListener(new ActionListener() { 

        public void actionPerformed(ActionEvent ae) { 

         final JFileChooser chooseFile = new JFileChooser(); 
         FileNameExtensionFilter filter = new FileNameExtensionFilter(".txt","txt"); 
         chooseFile.setFileFilter(filter); 
         chooseFile.setAcceptAllFileFilterUsed(false); 
         chooseFile.setMultiSelectionEnabled(true); 

         if(ae.getSource().equals(btn)) 
         { 
          System.out.println("do in background running"); 

          int returnVal = chooseFile.showOpenDialog(MyPanel3.this); 

          if(returnVal == JFileChooser.APPROVE_OPTION) 
          {                 
           File[] files = chooseFile.getSelectedFiles(); 


           testfile = files[0].getPath(); 

           publish(testfile); 
          } 
         } 
        } 
       }); 

       return null; 
      } 


      protected void process(String s) { 
         jcomp.append(s); 

      } 


     protected void done() { 

      try 
      { 
       //System.out.println("The operation was completed"); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 


     }.execute();  
    } 


    public static void main(String[] args){ 

     JFrame frame = new JFrame ("MyTest"); 
     frame.getContentPane();  
     frame.add(new MyPanel3());  
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible (true);    
    } 
} 

предупреждение гласит:

Процесс метод (String) от типа нового SwingWorker() {} никогда не используется локально

EDIT: с помощью программы MadProgrammer теперь работает программа (выбор 3 файлов и печать путей в виде строк в текстовом поле)

import java.awt.Color; 
import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.List; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class MyPanel4 extends JPanel { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JTextArea jcomp; 
    private JButton btn; 


    public MyPanel4() { 
     //construct components 
     jcomp = new JTextArea(1, 1); 
     jcomp.setBorder(BorderFactory.createDashedBorder(Color.BLACK)); 
     btn = new JButton("open"); 

     btn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 

       final JFileChooser chooseFile = new JFileChooser(); 
       FileNameExtensionFilter filter = new FileNameExtensionFilter(".txt", "txt"); 
       chooseFile.setFileFilter(filter); 
       chooseFile.setAcceptAllFileFilterUsed(false); 
       chooseFile.setMultiSelectionEnabled(true); 

       int returnVal = chooseFile.showOpenDialog(MyPanel4.this); 
       if (returnVal == JFileChooser.APPROVE_OPTION) { 
        final File[] files = chooseFile.getSelectedFiles(); 


        new SwingWorker<Void, String>() { 

         private String testfile1 = files[0].getPath(); 
         private String testfile2 = files[1].getPath(); 
         private String testfile3 = files[2].getPath(); 



         protected Void doInBackground() { 

          List<String> b = new ArrayList<String>(); 

          b.add(testfile1); 
          b.add(testfile2); 
          b.add(testfile3); 

          publish(b.get(0)); 
          publish(b.get(1)); 
          publish(b.get(2)); 

          return null; 
         } 

         @Override 
         protected void process(List<String> chunks) { 

          for (String pathname : chunks) 
          { 
           jcomp.append(pathname + "\n"); 
          } 
         } 

         protected void done() { 
          try 
          { 
           System.out.println("Opration Completed"); 

          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        }.execute(); 
       } 
      } 
     }); 

     //adjust size and set layout 
     setPreferredSize(new Dimension(944, 575)); 
     BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 
     setLayout(layout); 

     //add main components 
     add(jcomp); 
     add(btn); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("MyTest"); 
     frame.getContentPane(); 
     frame.add(new MyPanel4()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

Не помещайте ваш слушатель действий в сторону doInBackGround, вместо этого замените их – MadProgrammer

ответ

1

The SwingWorker должны быть созданы внутри кнопки actionPerformed метод, так что при нажатии на кнопку, она будет работать SwingWorker

Вы должны также убедиться, что все взаимодействия с пользовательским интерфейсом отлично из контекста Диспетчерского потока событий. Это означает, что вы должны попросить пользователя выбрать файл сюда в контексте метода actionPerformed и передать результат в SwingWorked

Обновлено

Две дополнительные вещи ...

  1. Вы 'фактически не читает файл, а просто передаёт имя файла publish
  2. SwingWorker определяет process как protected void process(List<V> chunks), но вы определили его как protected void process(String s) ... означает, что вы на самом деле не перекрывая process метода, SwingWorker «с, но создать свой собственный ...

Посмотрите на this example, чтобы посмотреть, как вы могли бы быть возможность использовать SwingWorker прочитать файл ...

И обновить process иметь исправленный метод подписи ...

@Override 
protected void process(List<String> chunks) { 
    for (String line : chunks) { 
     output.append(line); 
    } 
} 

Помните, что вы должны, насколько это возможно, использование т он @Override аннотаций, когда вы думаете, перекрытый метод, компилятор сообщит вам, когда вы ошибаетесь, вы экономите много голову чешет ...

+0

. Да пробовал, но все равно не текст, может быть, что я не хватает некоторой логики с помощью метода process/publish? Я прочитал документацию оракула на SwingWorker и счел очень запутанным понять из примера там – Conor

+0

. Вы на самом деле не читаете файл, а просто передаете имя файла (методом 'publish'). Взгляните на [этот пример] (http://stackoverflow.com/questions/13212654/displaying-whatever-has-been-read-from-a-file-in-a-gui/13212766#13212766) – MadProgrammer

+0

спасибо за этот пример, но я почти уверен, что есть проблема с моим компилятором. Когда я пытаюсь использовать параметр List в потоке swingworker, он отображает ошибку «Тип List не является общим, его нельзя параметризовать аргументами \t «попробовал компиляцию как с JRE1.6, так и с 1.7, и я все еще получаю эту ошибку ?! – Conor

1

Это должно быть так:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class MyPanel3 extends JPanel { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private JTextArea jcomp; 
    private JButton btn; 
    private String testfile; 

    public MyPanel3() { 
     //construct components 
     jcomp = new JTextArea(1, 1); 
     jcomp.setBorder(BorderFactory.createDashedBorder(Color.BLACK)); 
     btn = new JButton("open"); 

     btn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 
       final JFileChooser chooseFile = new JFileChooser(); 
       FileNameExtensionFilter filter = new FileNameExtensionFilter(".txt", "txt"); 
       chooseFile.setFileFilter(filter); 
       chooseFile.setAcceptAllFileFilterUsed(false); 
       chooseFile.setMultiSelectionEnabled(true); 

       int returnVal = chooseFile.showOpenDialog(MyPanel3.this); 
       if (returnVal == JFileChooser.APPROVE_OPTION) { 
        File[] files = chooseFile.getSelectedFiles(); 

        testfile = files[0].getPath(); 

        new SwingWorker<Void, String>() { 
         protected Void doInBackground() { 
          publish(testfile); 
          return null; 
         } 

         protected void process(String s) { 
          jcomp.append(s); 
         } 

         protected void done() { 
          try { 
           //System.out.println("The operation was completed"); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 
        }.execute(); 
       } 
      } 
     }); 

     //adjust size and set layout 
     setPreferredSize(new Dimension(944, 575)); 
     BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 
     setLayout(layout); 

     //add main components 
     add(jcomp); 
     add(btn); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("MyTest"); 
     frame.getContentPane(); 
     frame.add(new MyPanel3()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Вы при запуске панели запускается рабочий стол. Но вы должны запускать его при нажатии кнопки.

+0

да, я вижу, что вы имеете в виду, хотя я все еще получаю предупреждение, когда я пробую этот код, и он до сих пор не добавляет текст: / – Conor

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