在文本文件中搜索特定文本。将其返回到文本框

Searching for specific text in a text file. Returning it to a textbox

我对 java 很陌生。我正在为 class 开展项目,该项目将在文本文件中查找书籍并显示有关它们的信息。主要是看书有没有存货。文本文件设置如下:{ISBN, Author, Type, Stock}

我编写了一个用户界面,允许用户输入 ISBN、作者和类型。理想情况下,我希望用户只搜索其中之一和 return 所需的信息。但是,目前仅通过 ISBN 进行搜索是可以接受的。我的代码现在只接受输入到文本框中的内容并将其显示在一个大文本框中。我对阅读文本文件有些熟悉,但不知道如何从文本框中获取文本并使用它来搜索文件。任何帮助将不胜感激。

这是我的代码:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.sql.*;


public class InventoryInterface extends JFrame
{
   private static final int FRAME_WIDTH = 600;
   private static final int FRAME_HEIGHT = 350;

   private JButton btnSearch;
   private JButton btnDatabase; 
   private JButton btnRefresh; 
   private JLabel lblISBN, lblAuthor, lblType;
   private JTextField txtISBN, txtAuthor, txtType;
   private JTextArea txtOutput;


   public InventoryInterfaceSimple()
   {
      createComponents();
      setSize(FRAME_WIDTH, FRAME_HEIGHT);
   }

   public void createComponents()
   {

      btnSearch = new JButton("Search");
      lblISBN = new JLabel("ISBN");
      lblAuthor = new JLabel("Author");
      lblType = new JLabel("Type");

      txtISBN = new JTextField(10);
      txtAuthor = new JTextField(10);
      txtType = new JTextField(10);
      txtOutput = new JTextArea(30,30);
      txtOutput.setText("");
      txtOutput.setEditable(false);   
      ActionListener action = new InventoryOutput();
      btnSearch.addActionListener(action);



      JPanel panel = new JPanel();
      panel.setLayout(null);



      lblISBN.setBounds(10,10,50,25);
      txtISBN.setBounds(55,10,125,25);
      lblAuthor.setBounds(10,40,50,25);
      txtAuthor.setBounds(55,40,125,25);
      lblType.setBounds(10,70,50,25);
      txtType.setBounds(55,70,125,25);

      btnSearch.setBounds(30,130,150,25);

      JScrollPane scrollArea = new JScrollPane(txtOutput);
      scrollArea.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
      scrollArea.setBounds(200,10,350,200);
      panel.add(scrollArea);

      panel.add(lblISBN);
      panel.add(txtISBN);
      panel.add(lblAuthor);
      panel.add(txtAuthor);
      panel.add(lblType);
      panel.add(txtType);
      panel.add(btnSearch);
      panel.add(scrollArea);

      add(panel);

   }

   class InventoryOutput implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
         String inventoryString = "";
         inventoryString += txtISBN.getText() + " - ";
         inventoryString += "Author: " + txtAuthor.getText() + " - ";
         inventoryString += "Type: " + txtType.getText() + " - ";

         txtOutput.append(inventoryString + "\n");

         txtISBN.setText("");
         txtAuthor.setText("");
         txtType.setText("");


      }
   } 

}
​

您可以创建一个 private String chosenISBN 并在 actionPerformed 方法中设置它的值。然后你就可以访问class中任何地方的值了。 如果需要,您甚至可以为 chosenISBN 创建一个 getter。

你可以用这个替换你的代码..这是一个起点,你可以对此代码做很多改进,但这会起作用。将 REPOSITORY_FILE_PATH 更改为您的数据文件

   class InventoryOutput implements ActionListener {
    private final String REPOSITORY_FILE_PATH = "C:\temp\book-repo.txt";
    private final File REPOSITORY_FILE = new File(REPOSITORY_FILE_PATH);

    public void actionPerformed(ActionEvent event) {
        String inventoryString = "";

        String requestedISBN = txtISBN.getText().trim().toLowerCase();
        String requestedAuthor = txtAuthor.getText().trim();
        String requestedType = txtType.getText().trim();

        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(REPOSITORY_FILE));
            String line;
            while ((line = reader.readLine()) != null) {
                String lineLtrim = line.toLowerCase().replaceAll("^\{", ""); //{
                String lineRtrim = lineLtrim.replaceAll("\}$", ""); //}
                String[] data = lineRtrim.split(","); //ISBN, Author, Type, Stock
                if (data.length < 4) {
                    throw new IllegalArgumentException("bad datafile: All fields must be entered: " + line);
                }
                if (data[0].equals(requestedISBN)) {
                    inventoryString += txtISBN.getText() + " - Author: " + data[1] + " - Type: " + data[2] + " - Stock:" + data[3];
                    txtOutput.append(inventoryString + "\n");
                    return;
                }
            }
            reader.close();
            inventoryString += txtISBN.getText() + " -  Not Found";
            txtOutput.append(inventoryString + "\n");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

您可以只添加此 main() 代码进行测试,理想情况下您应该编写单元测试——以涵盖所有情况。

public static void main(String[] args) {
    JFrame f = new InventoryInterface();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setPreferredSize(new Dimension(600, 600));
    f.pack();
    f.setVisible(true);
}

数据文件

{ISBN1234,me,drama,5}
{ISBN1235,me,Tech,0}
{ISBN1236,me,Fiction,2}
{ISBN1237,me,Audio/Kids,4}

不确定你没有得到哪一部分,

  1. 在侦听器上——我们读取用户输入的 ISBN String requestedISBN = txtISBN.getText().trim().toLowerCase(); 并转换 它是小写的,所以我们可以与 lower-cased-data
  2. 进行比较
  3. 然后我们读取您的数据文件(逐行)
  4. 然后我们从每一行中删除字符“{”和“}”//注释 说
  5. 然后我们得到 "isbn,author, type, stock" ,所以我们用 ","
  6. 分开
  7. split 给我们一个字符串数组,把数组中的每个元素放在 顺序即数据 [0] 有 isbn,数据 [1] 有作者 ...etc
  8. 我们检查数据文件是否正确,确保我们拥有所有 那里的元素,即 if (data.length < 4) {
  9. 如果数组的大小不小于 4,我们将抛出异常,即我们发现 数据文件有不正确的数据。
  10. 然后我们比较输入isbn(数据[0])是否与其中一个相同 数据文件中的行元素
  11. 如果找到匹配项,我们将其显示在 textArea 中并退出循环,
  12. 如果找不到我们显示 "not Found"

如果您自己编写代码(侦听器),这对您来说应该是微不足道的。