JFileChooser Thread & JLabel



我正在创建一个解析器,这就是为什么我使用JFileChooser。当我用JFileChooser选择一个文件时,我希望有一个JLabel,上面写着:"正在进行解析"或类似的内容。当解析完成后:"解析完成".

(我的第一个目标是使用进度条,但现在对我来说有点复杂)

ReadFile类将接受一个文件数组,并为每个文件创建Callable。如果5个文件:5个线程将被调用。我使用Callable是因为我需要为每个线程获取数据字符串,并将其写入相同的csv文件。

嗯,当我在JFileChooser上单击Cancel时,JLabel在正确的时刻正确显示,但是当我为解析函数选择文件/文件时,JLabel等待我的Callables的整个执行,然后出现"处理"(但当它已经结束^^)。

我无法在线程开始时显示处理。

注意:我调用CardLayout在这个时刻,但它还没有使用。

下面是我的代码:
public class Main {
    private static final String CARD_MAIN =  "Card Main";
    private static final String CARD_FILE = "Card File";    
    public static void main(String[] args) throws IOException {
        createGUI();            
    }
    public static void createGUI(){
         // the JFrame
         final JFrame window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setLocationRelativeTo(null);
            window.setTitle("TMG Parser - Thales");
            window.setSize(400, 100);

            // the buttonPanel ( one to open JFileChooser & one to quit )
            JPanel container = new JPanel();
            JPanel buttonPanel = new JPanel(); 
            final JButton fileButton = new JButton("Choose File");
            fileButton.setBackground(Color.BLACK);
            fileButton.setForeground(Color.WHITE);
            final JButton quitButton = new JButton("Quit");
            quitButton.setBackground(Color.RED);
            quitButton.setForeground(Color.WHITE);
            // adding buttons to panel
            buttonPanel.add(fileButton);
            buttonPanel.add(quitButton);
            // the status label that says : processing or done
            final JLabel status = new JLabel();
            container.add(status);
            fileButton.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent ae)
                {
                    JFileChooser dialogue = new JFileChooser(new File("."));
                    dialogue.setMultiSelectionEnabled(true) ;
                    if (dialogue.showOpenDialog(null)== 
                        JFileChooser.APPROVE_OPTION) {
                            status.setText("Processing");
                           File[] fichiers=dialogue.getSelectedFiles();
                        for( int i = 1; i<fichiers.length; ++i){ 
                            fichiers[i].getName();  
                            fichiers[i].getAbsolutePath();
                           }
                         // calling my execution function (threads)
                        ReadFile readProgram = new ReadFile(fichiers);

                    }
                    else{status.setText("Action cancelled");}
                }
            });
            quitButton.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent ae)
                {
                    System.exit(0);
                }
            });
            window.add(container, BorderLayout.CENTER);
            window.add(buttonPanel, BorderLayout.PAGE_END);

            window.setVisible(true);
        }
}

好吧,@tobias_k是对的!谢谢你,伙计。

当我启动ReadFile时,它冻结了我的swing线程,直到ReadFile完成。

我将ReadFile更改为线程(并调用可调用对象),现在它可以完美地工作。谢谢!

相关内容

  • 没有找到相关文章

最新更新