2010-02-09 3 views
1

Я пытаюсь разработать «Найти и заменить», как в «Блокноте». Вот мой код до сих пор для поиска. Мне интересно, как я могу открыть диалоговое окно после нажатия кнопки, чтобы я мог использовать диалоговое окно для следующей находки.Диалоговое окно поиска и замены

import java.awt.BorderLayout; 
import java.awt.event.*; 
import java.io.FileInputStream; 
import java.io.FileReader; 
import java.util.Scanner; 

import javax.swing.*; 

class TextAreaEx extends JFrame implements ActionListener, KeyListener { 

    JButton button1; 
    JTextArea tx = new JTextArea(); 
    int startFrom = 0; 
    int offset = 0; 
    String find = ""; 
    String text = ""; 

    TextAreaEx() { 
     super("My Frame"); 
     FileInputStream fis = null; 
     StringBuffer sb = new StringBuffer(); 
     try { 
      Scanner scan = new Scanner(new FileReader("C:\\Users\\Sam\\Desktop\\networktools.txt")); 
      while (scan.hasNext()) // while there's still something to read 
      { 
       tx.append(scan.nextLine() + "\n"); // append 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     // text = sb.toString(); 
     text = tx.getText(); 
     text = text.toLowerCase(); 
     button1 = new JButton("Find"); 
     button1.addActionListener(this); 
     getContentPane().add(button1, BorderLayout.PAGE_START); 
     button1.setFocusable(false); 
     JScrollPane p1 = new JScrollPane(tx); 
     getContentPane().add(p1); 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     tx.addKeyListener(this); 
     setSize(400, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocation(400, 300); 
     setVisible(true); 
    } 

    public static void main(String s[]) { 
     new TextAreaEx(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     startFrom = 0; 
     offset = 0; 
     if (e.getSource() == button1) { 

      find = (String) JOptionPane.showInputDialog(this, "FIND:\n", "Find", JOptionPane.INFORMATION_MESSAGE, null, null, null); 
      find = find.toLowerCase(); 
      findWord(); 
      this.setVisible(true); 
     } 
    } 

    public void findWord() { 
     offset = text.indexOf(find, startFrom); 
     if (offset > -1) { 
      tx.setFocusable(true); 
      tx.select(offset, find.length() + offset); 
      startFrom = find.length() + offset + 1; 
     } else { 
      JOptionPane.showMessageDialog(this, "No (more) matches"); 
     } 
    } 

    public void keyPressed(KeyEvent ke) { 
     if (ke.getKeyCode() == KeyEvent.VK_F3) { 
      findWord(); 
     } 
    } 

    public void keyReleased(KeyEvent ke) { 
    } 

    public void keyTyped(KeyEvent ke) { 
    } 
} 

Спасибо за помощь.

ответ

5

JOptionPane предназначен для использования просто для простого вопроса, чтобы пользователь мог ответить да/нет, нормально/отменить или запросить простой ввод и быть закрытым. «Реальные» диалоги для поиска/замены должны делать намного больше, чем это, не пытайтесь использовать JOptionPane для этого, он не был предназначен для этой цели. Вам понадобится полное диалоговое окно (JFrame в вашем случае), которое может выполнить то, что вам нужно, и вы сможете расширить его, чтобы указать другие параметры, такие как «Случай соответствия», использовать регулярные выражения и так далее.

Примечание: кроме этого вашему коду необходимо много других улучшений. Начните с того, что вы не используете магические числа и строки жестко закодированы, соответствующим образом назовите свои переменные (а не кнопку 1), придерживайтесь условных обозначений кодирования и форматирования на используемом вами языке. Попытайтесь использовать более мелкие классы и методы, которые делают только одно: «У класса должна быть одна и только одна причина для изменения». Попытайтесь извлечь для себя функцию поиска в своем классе и написать для него единичные тесты. Со временем вы можете попытаться взглянуть на некоторые Java-проекты с открытым исходным кодом (JEdit - хороший пример для редактора), чтобы увидеть, как выглядит профессиональный код. Удачи.

Смежные вопросы