查找并替换对话框

时间:2010-02-09 23:25:57

标签: java swing

我正在尝试在记事本中开发一个查找和替换。到目前为止,这是我的代码。我想知道按下按钮后如何保持对话框打开,以便我可以使用该对话框进行下一次查找。

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 个答案:

答案 0 :(得分:6)

JOptionPane只是用于提出一个简单的问题,用户可以回答是/否,确定/取消或者询问简单输入而不是关闭。 “真正的”查找/替换对话框需要做的远不止这些,不要尝试使用JOptionPane,它不是为此目的而设计的。 您将需要完整的新对话框(在您的情况下为JFrame),它可以完成您的需要,并且您将能够扩展它以指定其他选项,如“匹配大小写”,使用正则表达式等。

注意:除此之外,您的代码还需要很多其他改进。首先不使用魔术数字和硬编码的字符串,适当地命名变量(而不是button1),坚持使用您正在使用的语言的编码和格式约定。尝试使用较小的类和方法只做一件事 - “一个类应该有一个,只有一个,有理由改变”。尝试在其自己的类中提取搜索功能本身并为其编写单元测试。 一段时间后,您可以尝试查看一些开源Java项目(JEdit是编辑器的好例子),看看专业代码的样子。 祝你好运。