搜索文本文件并在 JPanel 中显示结果 [英] Search text file and display results in a JPanel

查看:27
本文介绍了搜索文本文件并在 JPanel 中显示结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有人知道我如何搜索文本文件并在 JComponent 中列出结果,比如 JPanel.

Does anyone have any ideas on how I can search a text file and list the results in a JComponent, like a JPanel.

这两天我一直在努力解决这个问题,但没有成功会真正感谢回复.非常感谢.

I've been trying to make this work out for two days now, but no success will really appreciate a reply. Thanks a lot in advance.

我一直在尝试编写一个类来处理对文本文件的搜索查询.我的主要目标是获取包含在 JTextField 中输入的搜索关键字的文本文件中的行,并将它们打印在适当的 JComponent(类似于 JTextField、JTextPane,以最适用的为准)中.

I've been trying to write a class that handles search queries to a text file. My main goal is to get the lines in a text file that contain the search keywords entered in a JTextField and print them out in an appropriate JComponent(something like a JTextField, JTextPane, whichever best applicable).

我希望搜索结果显示在列中,例如 google 搜索结果的显示方式,以便文本文件中的每一行都打印在自己的行中.有人告诉我最好使用 ArrayList.我真的不知道该怎么做.我从各地收集了一些想法,这就是我目前所拥有的:

I'd like the search results to show in columns like how google search results get displayed, so that each line from the text file gets printed in its own line. I've been told that it's best to use an ArrayList. I really don't know how to do this. I've picked up ideas from all over and this is what I have so far:

提前致谢.我对Java很陌生.我一整天都在努力解决这个问题,但并没有走多远.我愿意尝试任何提供的东西,甚至是一种新的方法.

Much appreciation in advance. I am very new to Java. I've been at it the whole day trying to get this right and have not gone any far. Am willing to try anything offered, even a new approach.

// The class that handles the search query
// Notice that I've commented out some parts that show errors

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JTextPane;


public class Search {

    public static String path;
    public static String qri;

    public Search(String dTestFileDAT, String qry) {
        path = dTestFileDAT;
        qri = qry;
    }

    public static JTextPane resultJTextPane;
    public static List<String> linesToPresent = new ArrayList<String>();

    public static List<String> searchFile(String path, String match){

        File f = new File(path);
        FileReader fr;
        try {
            fr = new FileReader(f);
            BufferedReader br = new BufferedReader(fr);
            String line;
                do{
                    line = br.readLine();
                    Pattern p = Pattern.compile(match);
                    Matcher m = p.matcher(line);
                    if(m.find())
                        linesToPresent.add(line);
                } while(line != null);

                br.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // resultJTextPane = new JTextPane();
        // resultJTextPane = (JTextPane) Home.BulletinsJPanel.add(linesToPresent);

        return linesToPresent;
    }
}

// This handles the click event to take the query. Notice that I've commented out some parts that show errors
private void mouseClickedSearch(java.awt.event.MouseEvent evt) {
    Search fs = new Search("/D:/TestFile.dat/", "Text to search for");

    // searchResultsJPanel.add(Search.searchFile("/D:/TestFile.dat/", "COLE"));
    // searchResultsJTextField.add(fs);
}

推荐答案

有很多可能的解决方案,这只是一个简单的(不是认真的,它是 ;))

There are a number of possible solutions, this is just a simple one (no seriously, it is ;))

基本上,这只是使用 JList 来存储搜索文件中搜索文本的所有匹配项.

Basically, this just uses a JList to store all the matches of the search text from the search file.

这是一个区分大小写的搜索,所以要小心

This is a case sensitive search, so beware

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MySearch {

    public static void main(String[] args) {
        new MySearch();
    }

    public MySearch() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField findText;
        private JButton search;
        private DefaultListModel<String> model;

        public TestPane() {
            setLayout(new BorderLayout());
            JPanel searchPane = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            searchPane.add(new JLabel("Find: "), gbc);
            gbc.gridx++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;
            findText = new JTextField(20);
            searchPane.add(findText, gbc);

            gbc.gridx++;
            gbc.fill = GridBagConstraints.NONE;
            gbc.weightx = 0;
            search = new JButton("Search");
            searchPane.add(search, gbc);

            add(searchPane, BorderLayout.NORTH);

            model = new DefaultListModel<>();
            JList list = new JList(model);
            add(new JScrollPane(list));

            ActionHandler handler = new ActionHandler();

            search.addActionListener(handler);
            findText.addActionListener(handler);
        }

        public class ActionHandler implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                model.removeAllElements();
//                    BufferedReader reader = null;

                String searchText = findText.getText();
                try (BufferedReader reader = new BufferedReader(new FileReader(new File("search.txt")))) {

                    String text = null;
                    while ((text = reader.readLine()) != null) {

                        if (text.contains(searchText)) {

                            model.addElement(text);

                        }

                    }

                } catch (IOException exp) {

                    exp.printStackTrace();
                    JOptionPane.showMessageDialog(TestPane.this, "Could not create file", "Error", JOptionPane.ERROR_MESSAGE);

                }
            }
        }
    }
}

您也可以采取另一种策略并简单地突出显示匹配项...

You could also take another tact and simply highlight the matches...

这使用了一种稍微不同的方法,因为这是交互式的.基本上你只需输入,等待 1/4 秒,它就会开始搜索......

This uses a slightly different approach as this is interactive. Basically you simply type, wait a 1/4 second and it will start searching...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

public class MySearch02 {

    public static void main(String[] args) {
        new MySearch02();
    }

    public MySearch02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField findText;
        private JTextArea ta;
        private Timer keyTimer;

        public TestPane() {
            setLayout(new BorderLayout());
            JPanel searchPane = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(2, 2, 2, 2);
            searchPane.add(new JLabel("Find: "), gbc);
            gbc.gridx++;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;
            findText = new JTextField(20);
            searchPane.add(findText, gbc);

            add(searchPane, BorderLayout.NORTH);

            ta = new JTextArea(20, 40);
            ta.setWrapStyleWord(true);
            ta.setLineWrap(true);
            ta.setEditable(false);
            add(new JScrollPane(ta));

            loadFile();

            keyTimer = new Timer(250, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String find = findText.getText();
                    Document document = ta.getDocument();
                    try {
                        for (int index = 0; index + find.length() < document.getLength(); index++) {
                            String match = document.getText(index, find.length());
                            if (find.equals(match)) {
                                javax.swing.text.DefaultHighlighter.DefaultHighlightPainter highlightPainter =
                                        new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
                                ta.getHighlighter().addHighlight(index, index + find.length(),
                                        highlightPainter);
                            }
                        }
                    } catch (BadLocationException exp) {
                        exp.printStackTrace();
                    }
                }
            });
            keyTimer.setRepeats(false);

            findText.getDocument().addDocumentListener(new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    keyTimer.restart();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    keyTimer.restart();
                }

                @Override
                public void changedUpdate(DocumentEvent e) {
                    keyTimer.restart();
                }
            });
        }

        protected void loadFile() {
            String searchText = findText.getText();
            try (BufferedReader reader = new BufferedReader(new FileReader(new File("search.txt")))) {
                ta.read(reader, "Text");
            } catch (IOException exp) {
                exp.printStackTrace();
                JOptionPane.showMessageDialog(TestPane.this, "Could not create file", "Error", JOptionPane.ERROR_MESSAGE);
            }
            ta.setCaretPosition(0);
        }
    }
}

这篇关于搜索文本文件并在 JPanel 中显示结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆