0
JButton btnStart = new JButton("Start");
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {


                try{                
                    String filename =  fileName.getText();
                    FileReader fr = new FileReader(filename);
                    BufferedReader br = new BufferedReader(fr); 
                    Scanner scan = new Scanner(br);
                     filename = br.readLine();

                    if (filename != null){

                  String text = txtKeyword.getText();  
                  String line;
                  boolean hasError = true;

                while ((line = br.readLine()) != null) {

                if(line.contains(text)){
                    String newline = "\n";
                    jTextArea1.append(line + newline);
                    hasError = false;
                }   
                }
                if (hasError) {

                    JOptionPane.showMessageDialog(null, "Text Not Found");
                       br.close();
                       fr.close();
                    } 
                }}catch(IOException e){
                    JOptionPane.showMessageDialog(null, "File Not Found");
            }   }   
        });

したがって、この関数では、入力によって、言及されたディレクトリ/フォルダー内のいくつかのテキスト ファイルを読み取りたいと考えています。ユーザーが JFILECHOOSER メソッドを使用してディレクトリ/フォルダを選択すると、出力がテキストボックス [ディレクトリ] に一覧表示されます。fileName は、ユーザーがファイル名を入力するテキスト フィールドであり、ユーザーがファイル名を入力した後、開始ボタンをクリックするとします。開始ボタンは、指定されたディレクトリ/フォルダー [テキスト ボックス] を調べてテキスト ファイルを検索し、system.out.printIn を使用してテキスト ファイルの名前を出力することで機能します。ディレクトリ/フォルダー パスのコードは試していません。コーディング方法がわからないためです。この問題のヘルプまたはガイドはありますか? クラスを 1 つしか作成しておらず、JAVA GUI は初めてです

完全なコードは次のとおりです。

package com.directory.file;
import java.awt.BorderLayout;
import java.awt.Event;
import java.awt.EventQueue;
import java.awt.TextArea;
import java.awt.TextComponent;
import java.awt.Event.*;
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.Scanner;
import javax.lang.model.element.VariableElement;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Component;
import java.sql.*;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JSplitPane;
import javax.swing.JLayeredPane;
import javax.swing.JDesktopPane;
import javax.swing.JComboBox;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SpinnerDateModel;
import javax.swing.border.CompoundBorder;
import javax.swing.border.LineBorder;
import javax.swing.text.JTextComponent;
import java.awt.Color;
import javax.swing.SwingConstants;
import java.awt.ComponentOrientation;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Calendar;
import com.toedter.calendar.JDateChooser;
import javax.swing.JSpinner;
import org.eclipse.wb.swing.FocusTraversalOnArray;

public class Directory extends JFrame {
    private JPanel contentPane;
    private JTextField txtKeyword;
    private JTextField fileName;
    private JTextArea jTextArea1;
    private JDateChooser dateChooser;
    private JSpinner spinner_1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Directory frame = new Directory();
                    frame.setVisible(true);
                    frame.setSize(450,630);
                    frame.fileName.requestFocus(); 
                    } catch (Exception e) {
                    e.printStackTrace();        
                }
            }
        });
    }
    public Directory() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 436, 631);
        contentPane = new JPanel();
        contentPane.setAlignmentX(Component.LEFT_ALIGNMENT);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblDirectory = new JLabel("Directory:");
        lblDirectory.setBounds(20, 29, 55, 24);
        contentPane.add(lblDirectory);

        JLabel lblDate = new JLabel("Date:");
        lblDate.setBounds(37, 141, 55, 24);
        contentPane.add(lblDate);

        txtKeyword = new JTextField();
        txtKeyword.setHorizontalAlignment(SwingConstants.CENTER);
        txtKeyword.setToolTipText("");
        txtKeyword.setColumns(10);
        txtKeyword.setBounds(85, 193, 229, 20);
        contentPane.add(txtKeyword);

        final JDateChooser dateChooser = new JDateChooser();
        dateChooser.setDateFormatString("YYYMMd");
        dateChooser.setBounds(85, 141, 229, 20);
        contentPane.add(dateChooser);

        JLabel lblKeyword = new JLabel("Keyword:");
        lblKeyword.setBounds(20, 191, 55, 24);
        contentPane.add(lblKeyword);

        JSeparator separator = new JSeparator();
        separator.setBounds(148, 204, -113, 34);
        contentPane.add(separator);

        JButton btnExport = new JButton("Export");
        btnExport.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {     
            }
        });
        btnExport.setBounds(324, 556, 89, 23);
        contentPane.add(btnExport);

        final JLabel Directory = new JLabel("");
        Directory.setBorder(new LineBorder(new Color(0, 0, 0)));
        Directory.setBounds(85, 30, 290, 22);
        contentPane.add(Directory);

        int min = 0;
        int max = 23;
        int step = 1;
        int initValue = 0;
        SpinnerModel sm = new SpinnerNumberModel(initValue, min, max, step);
        final JSpinner spinner_1 = new JSpinner(new SpinnerNumberModel(0, 0, 23-1, 1));

        spinner_1.setBounds(324, 143, 89, 20);
                contentPane.add(spinner_1);


        JButton btnNewButton = new JButton("...");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.showOpenDialog(null);
                File f = chooser.getSelectedFile();
                String filename =f.getAbsolutePath();
                Directory.setText(filename);

        });
        btnNewButton.setBounds(377, 30, 36, 23);
        contentPane.add(btnNewButton);

        final JTextArea jTextArea1 = new JTextArea();
        jTextArea1.setRows(15);
        jTextArea1.setColumns(15);
        jTextArea1.setBounds(42, 249, 351, 294);
        jTextArea1.setLineWrap(true);
        jTextArea1.setWrapStyleWord(true);
        contentPane.add(jTextArea1);
        jTextArea1.setEditable(false);

        JButton btnStart = new JButton("Start");
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {


                try{                
                    String filename =  fileName.getText();
                    FileReader fr = new FileReader(filename);
                    BufferedReader br = new BufferedReader(fr); 
                    Scanner scan = new Scanner(br);
                     filename = br.readLine();

                    if (filename != null){

                  String text = txtKeyword.getText();  
                  String line;
                  boolean hasError = true;

                while ((line = br.readLine()) != null) {

                if(line.contains(text)){
                    String newline = "\n";
                    jTextArea1.append(line + newline);
                    hasError = false;
                }   
                }
                if (hasError) {

                    JOptionPane.showMessageDialog(null, "Text Not Found");
                       br.close();
                       fr.close();
                    } 
                }}catch(IOException e){
                    JOptionPane.showMessageDialog(null, "File Not Found");
            }   }
        });

        btnStart.setBounds(324, 215, 89, 23);
        contentPane.add(btnStart);


        JLabel lblFileName_1 = new JLabel("File Name:");
        lblFileName_1.setBounds(20, 79, 75, 24);
        contentPane.add(lblFileName_1);


        fileName = new JTextField();
        fileName.setToolTipText("");
        fileName.setHorizontalAlignment(SwingConstants.CENTER);
        fileName.setColumns(10);
        fileName.setBounds(85, 81, 290, 20);
        contentPane.add(fileName);
        contentPane.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{fileName, lblDirectory, lblDate, txtKeyword, btnStart, lblKeyword, separator, btnExport, Directory, dateChooser, dateChooser.getCalendarButton(), spinner_1, btnNewButton, jTextArea1, lblFileName_1}));          
    }
}
4

1 に答える 1

1

問題#1

fileNameファイルを開こうとするときにのみ値を使用します...

FileReader fr = new FileReader(filename);

ファイルは、ディレクトリと名前の連結です。たとえば...

FileReader fr = new FileReader(new File(Directory.getText(), filename));

問題#2

必要のないファイルである種のプリエンプティブ読み取りを行っています...

if (filename != null){

    String text = txtKeyword.getText();  
    String line;
    boolean hasError = true;

    while ((line = br.readLine()) != null) {

ファイルの読み取りを開始する必要があります。そうしないと、テキストの最初の行が失われます

問題#3

何らかの例外が発生した場合にストリームを閉じていません...

try {
    FileReader fr = new FileReader(new File(Directory.getText(), filename));
    BufferedReader br = new BufferedReader(fr);
    //...
} catch (IOException e) {
    JOptionPane.showMessageDialog(null, "File Not Found");
}

何らかの理由で、ストリームを開いたり読んだりしているときに例外が発生した場合、ストリームを閉じることはできません...少なくともJVMが閉じるまでは

代わりに、try-with-resourcesJava 7 以降を使用している場合は使用するか、finallyブロックを使用して、ストリームが閉じていることを確認する必要があります。たとえば...

BufferedReader br = null;
try {
    String filename = fileName.getText();
    br = new BufferedReader(new FileReader(new File(Directory.getText(), filename)));
    //...
} catch (IOException e) {
    JOptionPane.showMessageDialog(null, "File Not Found");
} finally {
    try {
        br.close();
    } catch (Exception e) {
    }
}

少なくとも実際の例外のスタックトレースをダンプするか、何らかの方法でログに記録すると、さらに役立ちます...

} catch (IOException e) {
    e.printStackTrace();
    JOptionPane.showMessageDialog(null, "File Not Found");
} finally {

問題#4

nullレイアウト。ピクセル パーフェクト レイアウトは、最新の UI デザインでは錯覚です。フォント、DPI、レンダリング パイプライン、またはコンポーネントが画面にレンダリングされる方法を変更するその他の要因を制御することはできません。

Swing は、これらの問題を解決するためにレイアウト マネージャーと連携するように設計されています。これらの機能を無視し、API の設計に反する作業を行う場合は、多くの頭痛の種と終わらないハードワークに備えてください...

于 2014-05-22T07:18:47.957 に答える