有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SwingWorker进程()警告

我试图用Swing编写一个简单的测试程序,我只想加载一个文本文件并在文本区域中显示所选文本文件的路径。我一直收到一条关于进程方法“从不在本地使用”的警告,并且它没有向文本框添加任何文本。也许我误解了什么,我希望有人能帮助我

代码:

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

警告如下:

The method process(String) from the type new SwingWorker(){} is never used locally

编辑: 在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);
    }
}

共 (2) 个答案

  1. # 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);
        }
    }
    

    创建面板时正在运行worker。但您应该在单击按钮时运行它

  2. # 2 楼答案

    SwingWorker应该在按钮actionPerformed方法中创建,这样当您单击按钮时,它将运行SwingWorker

    您还应该确保在事件调度线程的上下文中与用户界面的所有交互都是良好的。这意味着您应该要求用户在actionPerformed方法的上下文中选择文件fro,并将结果传递给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注释。当您认为您正在重写一个方法时,编译器会在您出错时告诉您,这样可以省去很多麻烦