我正在创建一个解析器,这就是为什么我使用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更改为线程(并调用可调用对象),现在它可以完美地工作。谢谢!