2013-08-01 21 views
5

Czy ktoś ma jakieś pomysły na to, w jaki sposób mogę przeszukać plik tekstowy i wyświetlić wyniki w JComponentu, takim jak JPanel.Przeszukuj plik tekstowy i wyświetlaj wyniki w pliku JPanel

Od dwóch dni staram się to udoskonalić, ale żaden sukces naprawdę nie doceni odpowiedzi. Z góry dziękuję.

Próbuję napisać klasy, która obsługuje kwerend wyszukiwania do pliku tekstowego. Moim głównym celem jest uzyskanie linii w pliku tekstowym, który zawiera słowa kluczowe wyszukiwania wpisane w JTextField i wydrukowanie ich w odpowiednim JComponentu (coś takiego jak JTextField, JTextPane, w zależności od tego, która z nich jest najlepsza).

Chciałbym, aby wyniki wyszukiwania pokazywały się w kolumnach, jak wyświetlane są wyniki wyszukiwania w Google, tak aby każda linia z pliku tekstowego była drukowana we własnym wierszu. Powiedziano mi, że najlepiej jest używać ArrayList. Naprawdę nie wiem, jak to zrobić. Wziąłem pomysły z całego świata i to jest to, co do tej pory miałem:

Z dużym uznaniem z góry. Jestem bardzo nowy w Javie. Byłem w tym cały dzień, próbując to naprawić i nie poszedłem daleko. Jestem gotów spróbować czegoś oferowanego, nawet nowego podejścia.

// 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); 
} 
+0

* "Czy ktoś ma jakieś pomysły jak mogę wyszukać plik tekstowy i wyświetlić wyniki w JComponentu, takim jak JPanel? * "- Tak - [Co próbowałeś?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) Może może dać jakiś kierunek – MadProgrammer

+0

Próbujesz zrobić to przez dwa dni, więc na pewno masz jakiś kod, który możesz nam pokazać? Jakiś punkt wyjścia? Zobaczmy. – Kon

+0

@olicver muchai zobacz JTextPane.read() – mKorbel

Odpowiedz

8

Istnieje wiele możliwych rozwiązań, to tylko prosta (nie poważnie, to jest;))

Zasadniczo, to właśnie wykorzystuje JList przechowywać wszystkie mecze tekstu wyszukiwania z pliku wyszukiwania.

Jest to przypadek wrażliwe wyszukiwania, więc uważaj

enter image description here

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); 

       } 
      } 
     } 
    } 
} 

Można również wziąć inny taktu i po prostu podkreślić mecze ...

enter image description here

Wykorzystuje nieco inne podejście, ponieważ jest interaktywne. Zasadniczo po prostu wpisać, poczekać 1/4 sekundy i rozpocznie poszukiwania ...

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); 
     } 
    } 
} 
+0

doskonała ........... – mKorbel

+0

@mKorbel Można by pomyśleć, że jestem internatem lub coś podobnego ;) – MadProgrammer

+0

:-) byłeś internatem lub czymś, phaaaa, nie mam problemu z nazwaniem rzeczy własnymi imionami – mKorbel

0

Spróbuj tego:

import java.awt.BorderLayout; 
import java.awt.Component; 
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 java.io.InputStreamReader; 
import java.util.StringJoiner; 
import javax.swing.DefaultListCellRenderer; 
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 SearchTextFile { 

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

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

      JFrame frame = new JFrame("Bible Search"); 
      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; 
    private JList list; 

    private String searchPhrase; 

    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<>(); 
     list = new JList(model); 
     list.setCellRenderer(new HighlightListCellRenderer()); 
     add(new JScrollPane(list)); 

     ActionHandler handler = new ActionHandler(); 

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

     try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/Script.txt")))) { 

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

     } catch (IOException exp) { 

      exp.printStackTrace(); 

     } 
    } 

    public class ActionHandler implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      searchPhrase = findText.getText(); 
      if (searchPhrase != null && searchPhrase.trim().length() == 0) { 
       searchPhrase = null; 
      } 
      list.repaint(); 
//    model.removeAllElements(); 
////     BufferedReader reader = null; 
// 
//    String searchText = findText.getText(); 
//    try (BufferedReader reader = new BufferedReader(new FileReader(new File("bible.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, "Something Went  Wrong", "Error", JOptionPane.ERROR_MESSAGE); 
// 
//    } 
     } 
    } 

     public class HighlightListCellRenderer extends DefaultListCellRenderer { 

     public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))"; 

     @Override 
     public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      if (value instanceof String && searchPhrase != null) { 
       String text = (String) value; 
       if (text.contains(searchPhrase)) { 
        text = text.replace(" ", "&nbsp;"); 
        value = "<html>" + text.replace(searchPhrase, "<font color=#ffff00>" + searchPhrase + "</font>") + "</html>"; 
       } 
      } 
      return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates. 
     } 

    } 
} 
}