2013-10-13 73 views
0

我试图写入使用摇摆一个简单的测试程序,所有我想要做的是加载的文本文件和在文本区域显示所选择的文本文件的路径。我不断收到关于“永不本地使用”,它是不附加任何文本到文本框中的过程方法的警告。也许我误解了一些东西,希望有人能帮助我。SwingWorker类方法()警告

代码:

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);    
    } 
} 

警告读取:

从类型新 SwingWorker类(){所述的方法处理(字符串)}是从来没有在本地使用

编辑: 与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

SwingWorker应的按钮内创建actionPerformed方法,这样,当你按一下按钮,它会运行SwingWorker

你应该还,确保与用户界面的所有交互都很好从事件调度线程的上下文中。这意味着你应该要求用户选择来回actionPerformed方法的上下文中的文件,并将结果传递到SwingWorked

更新

两个额外的东西...

  1. 你实际上没有读取文件,而只是将文件名称传递给publish方法
  2. SwingWorkerprocess定义为protected void process(List<V> chunks)但你把它定义为protected void process(String s) ...意味着你实际上不重写SwingWorkerprocess方法,但创建自己的...

看看this example看你怎么可能能够使用SwingWorker读取文件...

而且,更新您的process有修正的方法签名......

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

记住,你应尽可能地,使用@Override注释,当你认为你覆盖方法,编译器会告诉你,当你弄错了,为您节省大量挠头的...

+0

是尝试过,但仍然没有文字,会不会是我缺少一些逻辑与过程/发布的方法?我阅读了SwingWorker上的oracle文档,发现从那里的例子中了解到它非常混乱。 – Conor

+0

您实际上并不是在阅读文件,而只是传递文件的名称(通过'publish'方法)。看看[这个例子](http://stackoverflow.com/questions/13212654/displaying-whatever-has-been-read-from-a-file-in-a-gui/13212766#13212766) – MadProgrammer

+0

感谢这个例子,但我几乎肯定有我的编译器有问题,现在..当我尝试使用列表参数中的SwingWorker线程它会显示错误“类型列表中没有通用的;它不能与参数进行参数 \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