Относительно JFileChooser

Я разработал программу, которая подсчитывает количество строк в файле, показанном ниже.

Scanner in=new Scanner(System.in);
    System.out.println("Enter the Drive name like C,D,E etc");
    String drive=in.next();
    System.out.println("Enter the main folder name");
    String main_folder=in.next();
    File directory=new File(drive+":"+"//"+main_folder+"//");

Map<String, Integer> result = new HashMap<String, Integer>();
    //File directory = new File("C:/Test/");
    File[] files = directory.listFiles();
    for (File file : files) {
        if (file.isFile()) {
            Scanner scanner = new Scanner(new FileReader(file));
            int lineCount = 0;
            try {
                for (lineCount = 0; scanner.nextLine() != null; lineCount++);
            } catch (NoSuchElementException e) {
                result.put(file.getName(), lineCount);
            } }}        

    for( Map.Entry<String, Integer> entry:result.entrySet()){
          System.out.println(entry.getKey()+" ==> "+entry.getValue());
        }

но я пытался добавить свинг-интерфейс JFilechooser, я хочу, чтобы пользователь выбрал конкретную папку и все файлы внутри этой папки, чтобы они были выбраны и отдыхали выше, поскольку мой код работает как есть, пожалуйста, сообщите

Пожалуйста, посоветуйте, как настроить средство выбора jfile, чтобы я мог интегрировать мой код выше.

У меня есть еще одно решение, которое

package aa;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.FileDialog;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class FileBrowse extends JFrame {

private JButton browseSwing = new JButton("Choose File");
private JTextField textField = new JTextField(30);
private JButton approve = new JButton("Ok");


public FileBrowse() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,80);
setResizable(false);

browseSwing.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        if (arg0.getSource()==browseSwing)
        onBrowseSwing();
        }});


Container container = getContentPane();
container.setLayout(new FlowLayout());
container.add(browseSwing);
container.add(textField);
container.add(approve);

//pack();
}

protected void onBrowseSwing() {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showDialog(this, "Open/Save");
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
textField.setText(file.toString());
String x = file.toString();
fileRead(x);
}
}

public void fileRead(String input){
    try{
        // Open the file that is the first
        // command line parameter
        FileInputStream fstream = new FileInputStream(input);
        // Get the object of DataInputStream
        DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        int count = 0;
        int count2 = 0;
        //Read File Line By Line
        while((strLine = br.readLine())!= null ){
            if (strLine.trim().length() != 0){
                count++;
            }else{
                count2++;
            }
        }
        System.out.println("-------Lines Of COdes-------");
        System.out.println("number of lines:" + count);
        System.out.println("number of blank lines:" + count2);
        //Close the input stream
        in.close();
        }catch (Exception e){//Catch exception if any
          System.err.println("Error: " + e.getMessage());
        }


}


public static void main(String[] args) {
new FileBrowse().setVisible(true);

}
}

но он выбирает отдельные файлы, которые я хочу, чтобы все файлы были выбраны внутри этой папки Test


person user1464381    schedule 28.06.2012    source источник
comment
Я бы лучше использовал LineReader, чем Scanner   -  person mKorbel    schedule 28.06.2012
comment
@mKorbel не могли бы вы показать это ..!   -  person user1464381    schedule 28.06.2012
comment
например   -  person mKorbel    schedule 28.06.2012


Ответы (1)


Вы можете использовать этот код (адаптировано из здесь):

    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(new java.io.File("."));
    chooser.setDialogTitle("choosertitle");
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    chooser.setAcceptAllFileFilterUsed(false);

    if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
    {

        Map<String, Integer> result = new HashMap<String, Integer>();
        File directory = new File(choosers.getSelectedFile().getAbsolutePath()); //This is where you need to change.
        File[] files = directory.listFiles();
        for (File file : files)
        {
            if (file.isFile())
            {
                Scanner scanner = new Scanner(new FileReader(file));
                int lineCount = 0;
                try
                {
                    for (lineCount = 0; scanner.nextLine() != null; lineCount++)
                        ;
                } catch (NoSuchElementException e)
                {
                    result.put(file.getName(), lineCount);
                }
            }
        }

        for (Map.Entry<String, Integer> entry : result.entrySet())
        {
            System.out.println(entry.getKey() + " ==> " + entry.getValue());
        }
    }

Этот код должен заменить этот раздел:

Scanner in=new Scanner(System.in);
System.out.println("Enter the Drive name like C,D,E etc");
String drive=in.next();
System.out.println("Enter the main folder name");
String main_folder=in.next();
File directory=new File(drive+":"+"//"+main_folder+"//");

Кроме того, просто рекомендация: при работе с консолями и системными путями в идеале следует использовать File.seperator. Это автоматически предоставит вам символ разделения пути соответствующей системы.

Согласно вашему редактированию, в вашем случае вы используете файл fileChooser.getSelectedFile();. Это даст вам только тот файл, который выбрал пользователь, в соответствии с его именем. Что вы должны использовать, так это fileChooser.getSelectedFile().getAbsolutePath() и перебирать файлы, которые находятся в том же каталоге (как показано выше).

РЕДАКТИРОВАТЬ 2: я использую этот код для отображения 2 кнопок с соответствующими обработчиками событий:

public static void main(String args[]) {
        JFrame frame = new JFrame("Button Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton btnExit= new JButton("EXIT");    

        ActionListener actionListenerExitButton = new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent actionEvent) {
            System.out.println("Exit Button Was Clicked");
          }
        };
        btnExit.addActionListener(actionListenerExitButton);

        JButton btnEnter = new JButton("ENTER");
        ActionListener actionListenerEnterButton = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                System.out.println("Enter Button Was Clicked");
            }
        };
        btnEnter.addActionListener(actionListenerEnterButton);

        Container contentPane = frame.getContentPane();
        contentPane.add(btnExit, BorderLayout.SOUTH);
        contentPane.add(btnEnter, BorderLayout.NORTH);
        frame.setSize(300, 100);
        frame.setVisible(true);
      }

Все, что вам нужно сделать сейчас, это вставить код, который я предоставил ранее, в соответствующий обработчик событий.

person npinti    schedule 28.06.2012
comment
@npinti.. спасибо, он может выбрать тестовый каталог, но он не считает все файлы, он считает только один файл внутри этой папки - person user1464381; 28.06.2012
comment
@ user1464381: Вы использовали код, который я предложил, или вы изменили свой собственный? - person npinti; 28.06.2012
comment
да, я использовал тот же код, который вы предложили, но все же он собирает отдельный файл. пожалуйста, порекомендуйте - person user1464381; 28.06.2012
comment
@npinti.. не могли бы вы посоветовать, что не щелкает - person user1464381; 28.06.2012
comment
@ user1464381: Я допустил ошибку (давно не использовал Swing), так что мне плохо. Я исправил ошибку, и это должно работать, по крайней мере, это сработало для меня. - person npinti; 28.06.2012
comment
@npinti .. большое спасибо, это работает, не могли бы вы также посоветовать, когда я запускаю это приложение, по умолчанию, когда диалоговое окно открывается, оно по умолчанию находится в другой папке, я хочу, чтобы при выполнении оно по умолчанию находилось в c: местоположение, дальнейший пользователь может перемещаться, пожалуйста, сообщите, как этого добиться - person user1464381; 28.06.2012
comment
@user1464381: user1464381: Чтобы изменить начальный каталог, все, что вам нужно сделать, это изменить эту строку: chooser.setCurrentDirectory(new java.io.File(".")); на что-то вроде chooser.setCurrentDirectory(new java.io.File("C:" + File.seperator)); - person npinti; 28.06.2012
comment
@npinti .. большое спасибо, это работает .. не могли бы вы также посоветовать, скажем, я хочу, чтобы сначала при выполнении приложения в главном окне было две кнопки ENTER и EXIT , при нажатии EXIT приложение должно завершиться и при нажатии на ENTER мое приложение откроет диалоговое окно для выбора папки, как это делается сейчас. какова основная цель, главное окно с двумя кнопками должно появиться первым, пожалуйста, посоветуйте, как этого добиться и интегрировать с настоящим приложением - person user1464381; 28.06.2012
comment
@ user1464381: Что вам нужно сделать, так это получить JFrame и отобразить все, что вам нужно JButtons. Вы должны быть в состоянии найти множество учебных пособий в Интернете. В обработчике событий для кнопки «Ввод» просто вставьте предоставленный мной код. Он, в свою очередь, должен показать JFileChooser и запустить остальную часть программы. Однако обратите внимание, что это будет печатать на консоли, а не в графическом интерфейсе. Вы можете использовать JTextArea для отображения содержимого. - person npinti; 28.06.2012
comment
@npinti .. не могли бы вы показать мне, как этого добиться .. это будет большим подспорьем. - person user1464381; 28.06.2012
comment
@ user1464381: Это очень похоже на то, что вы делаете. Как я уже сказал, вы должны быть в состоянии найти всю необходимую помощь в Интернете. - person npinti; 28.06.2012
comment
@npinti..пожалуйста, если бы вы могли предложить несколько URL-адресов, так как я новичок в мире свинга, в любом случае, большое спасибо, но если бы вы могли показать, это было бы большим подспорьем, заранее спасибо - person user1464381; 28.06.2012
comment
@user1464381: посмотрите здесь. Я сомневаюсь, что это может быть проще, чем это. В вашем случае обработчиком события является метод actionPerformed. - person npinti; 28.06.2012
comment
@npinti.. Я могу добавить рамку, но не кнопки .. JFrame frame = new JFrame (Frame в Java Swing); frame.setSize(400, 400); frame.setVisible (истина); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - person user1464381; 28.06.2012
comment
@ user1464381: я улучшил свой ответ. Пожалуйста, посмотрите./ - person npinti; 28.06.2012