диалоговое окно поиска и замены - PullRequest
2 голосов
/ 10 февраля 2010

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

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) {
    }
}

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

1 Ответ

6 голосов
/ 10 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...