如果用户选择无效文件

时间:2016-02-17 15:06:57

标签: java multithreading swing execution

我有一个读取固定长度文件的方法。我正在尝试为用户提供适当的验证。所以,在我下面的代码中包含的方法。

if (currentLine.length() != 257) {
    ViewClass view = new ViewClass();
    ViewClass.invalidFile();
}

View类中的方法invalidFile()如下所示。

public void invalidFile(){
    JOptionPane.showMessageDialog(this.rootPane, "Invalid File Selected");        
}

我有三个要上传的文件。一旦用户选择了所有文件并点击生成输出,就会启动读取文件的过程。所以,我的问题是当用户上传无效文件时,会向用户显示一条消息,但一旦用户点击“确定”,就会读取下一个文件。下面是单击“生成输出”时调用的方法。

 private void jGenerateOutputBtnActionPerformed(java.awt.event.ActionEvent evt) {                                                   
    Thread execThread = new Thread() {
        public void run() {
            readFirstFile();
            readSecondFile();
            readThirdFile();
       }
    }
};
execThread.start();   

我的目标是阻止程序进一步执行。我在invalidFile()中包含了System.exit(0),但随后关闭了窗口。我想保持窗口打开但停止执行,直到用户选择有效文件。

PS:请告诉我这是否已经被问到或者这里不应该问什么。我没有发现任何重复。感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

使readFirstFile,readSecondFile和readThirdFile在出现任何问题时抛出异常,并在try / catch块中包含对这些方法的调用。只要这些函数中的任何一个抛出异常,就不会调用以下函数

答案 1 :(得分:0)

如果你让invalidFile()抛出异常,你可以按照规定的方式处理它。

public void invalidFile() throws IOException {
    JOptionPane.showMessageDialog(this.rootPane, "Invalid File Selected");
    throw new IOException("Invalid file");
}

private void readFirstFile() throws IOException {
    // ...
    invalidFile();
}

private void jGenerateOutputBtnActionPerformed(java.awt.event.ActionEvent evt) {
    Thread execThread = new Thread() {
        public void run() {
            try {
                readFirstFile();
                readSecondFile();
                readThirdFile();
            } catch (IOException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }
}

答案 2 :(得分:0)

下面的示例代码将打开JFileChooser,它将仅列出具有特定文件大小的文件。 [注意:根据public boolean accept(File f) FileFilter文件内容的实现情况,可以验证文件的内容,但对于大文件,它会对性能产生影响。]

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;

class FileSizeFilter extends FileFilter {

  int size;
  String description;

  public FileSizeFilter(int size, String description) {
    this.size = size;
    this.description = description;
  }

  public FileSizeFilter() {
    super();
    // TODO Auto-generated constructor stub
  }

  @Override
  public boolean accept(File f) {
    if (f.isFile()) {
      long l = f.length();
      // check on size basis
      // or
      // read the file line by line and check the length of line
      if (l == size) {
        return true;
      }
    }
    return false;
  }

  @Override
  public String getDescription() {
    return description;
  }
}

/**
 */
public class Demo {

  public static void main(String[] args) {
    final JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
    frame.setLayout(new FlowLayout());

    JButton button = new JButton("Select Files");

    button.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked");
        JFileChooser fileChooser = new JFileChooser();

        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

        fileChooser.setFileFilter(new FileSizeFilter(257, "File Size Limiter"));
        fileChooser.setMultiSelectionEnabled(true);
        fileChooser.showOpenDialog(frame);
        File[] selectedFiles = fileChooser.getSelectedFiles();
        if (selectedFiles != null) {
          for (File file : selectedFiles) {
            System.out.println(file.getAbsolutePath() + " : " + file.length());
          }
        }

      }

    });
    frame.add(button);
  }
}