java - 查找和替换对话框

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

感谢您的帮助。

最佳答案

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

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

关于java - 查找和替换对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233301/

相关文章:

java - Java游戏编程

java - printDebugData(JTabble table) 的作用是什么?

java - 我的面板无法滚动并且滚动 Pane 没有 slider

java - Spring Security Token认证 如何认证?

java - 如何漂亮地打印 HttpServletRequest 和 HttpServletResponse

java - 如何修复 "android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class fragment"

java - 让 JTextPane 根据内容调整高度

java - JTable 中的 JComboBox 不显示选择

java - 在 Java 中调试 makefile

java - 在 fragment 之间滑动