单击JFrame中的“搜索”按钮应打开搜索栏

时间:2013-01-29 09:43:17

标签: java swing pdf

我按照以下链接查看PDF文件。 Java Swing PDF Viewer

现在我需要向JFrame添加搜索按钮(除了导航按钮)。单击该搜索按钮应打开带有文本字段的标签。当客户端输入该文本字段的值时,它应该在整个PDF中执行搜索,并在文本字段中显示下面匹配的单词的计数。我是一个非常新的摇摆,并试图从3天找到解决方案。但我没有得到确切的解决方案。这对我来说非常紧迫。非常感谢任何帮助。

首先编辑:

public class PdfViewer extends JPanel {
    private static enum Navigation {
        GO_FIRST_PAGE, FORWARD, BACKWARD, GO_LAST_PAGE, GO_N_PAGE
    }

    private static final CharMatcher POSITIVE_DIGITAL = CharMatcher.anyOf("0123456789");
    private static final String GO_PAGE_TEMPLATE = "%s of %s";
    private static final int FIRST_PAGE = 1;
    private int currentPage = FIRST_PAGE;
    private JButton btnFirstPage;
    private JButton btnPreviousPage;
    private JTextField txtGoPage;
    private JButton btnNextPage;
    private JButton btnLastPage;
    private JButton print;
    private JButton search;
    private PagePanel pagePanel;
    private PDFFile pdfFile;

    public PdfViewer() {
        initial();
    }

    private void initial() {
        setLayout(new BorderLayout(0, 0));
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        add(topPanel, BorderLayout.NORTH);
        btnFirstPage = createButton("|<<");
        topPanel.add(btnFirstPage);
        btnPreviousPage = createButton("<<");
        topPanel.add(btnPreviousPage);
        txtGoPage = new JTextField(10);
        txtGoPage.setHorizontalAlignment(JTextField.CENTER);
        topPanel.add(txtGoPage);
        btnNextPage = createButton(">>");
        topPanel.add(btnNextPage);
        btnLastPage = createButton(">>|");
        topPanel.add(btnLastPage);

        search = new JButton("search");
        topPanel.add(search);
        JScrollPane scrollPane = new JScrollPane();
        add(scrollPane, BorderLayout.CENTER);
        JPanel viewPanel = new JPanel(new BorderLayout(0, 0));
        scrollPane.setViewportView(viewPanel);

        pagePanel = new PagePanel();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        pagePanel.setPreferredSize(screenSize);
        viewPanel.add(pagePanel, BorderLayout.CENTER);

        disableAllNavigationButton();

        btnFirstPage.addActionListener(new PageNavigationListener(Navigation.GO_FIRST_PAGE));
        btnPreviousPage.addActionListener(new PageNavigationListener(Navigation.BACKWARD));
        btnNextPage.addActionListener(new PageNavigationListener(Navigation.FORWARD));
        btnLastPage.addActionListener(new PageNavigationListener(Navigation.GO_LAST_PAGE));
        txtGoPage.addActionListener(new PageNavigationListener(Navigation.GO_N_PAGE));

        search.addActionListener(new Action1());
    }

    static class Action1 implements ActionListener {        
          public void actionPerformed (ActionEvent e) {  
              JFrame parent = new JFrame();
              JDialog jDialog = new JDialog();
              Label label = new Label("Search: ");
              final JTextField jTextField = new JTextField(10);
              JPanel panel = new JPanel();
              parent.add(panel);
              panel.add(label);
              panel.add(jTextField);
              parent.setVisible(true);
              parent.setSize(800,400);
              parent.setLocationRelativeTo(null);
          }
        }   
}

这是我修改过的代码。其余的代码与link中的相同。使用此代码,我在JFrame中获得了一个搜索按钮。当我点击该按钮时,它打开一个窗口,其中Search为标签名称,一个textfield。现在我在这里被打动了。当我输入一个值到那个文本字段时,它应该用整个pdf搜索文本字段值,并在下面显示匹配的计数到该文本字段。

第二次编辑:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import com.google.common.base.CharMatcher;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PagePanel;

public class PdfViewer extends JPanel {
    private static enum Navigation {
        GO_FIRST_PAGE, FORWARD, BACKWARD, GO_LAST_PAGE, GO_N_PAGE
    }

    private static final CharMatcher POSITIVE_DIGITAL = CharMatcher.anyOf("0123456789");
    private static final String GO_PAGE_TEMPLATE = "%s of %s";
    private static final int FIRST_PAGE = 1;
    private int currentPage = FIRST_PAGE;
    private JButton btnFirstPage;
    private JButton btnPreviousPage;
    private JTextField txtGoPage;
    private JButton btnNextPage;
    private JButton btnLastPage;
    private JButton print;
    private JButton search;
    private PagePanel pagePanel;
    private static PDFFile pdfFile;

    static String text;

    public PdfViewer() {
        initial();
    }

    private void initial() {
        setLayout(new BorderLayout(0, 0));
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        add(topPanel, BorderLayout.NORTH);
        btnFirstPage = createButton("|<<");
        topPanel.add(btnFirstPage);
        btnPreviousPage = createButton("<<");
        topPanel.add(btnPreviousPage);
        txtGoPage = new JTextField(10);
        txtGoPage.setHorizontalAlignment(JTextField.CENTER);
        topPanel.add(txtGoPage);
        btnNextPage = createButton(">>");
        topPanel.add(btnNextPage);
        btnLastPage = createButton(">>|");
        topPanel.add(btnLastPage);

        search = new JButton("search");
        topPanel.add(search);
        JScrollPane scrollPane = new JScrollPane();
        add(scrollPane, BorderLayout.CENTER);
        JPanel viewPanel = new JPanel(new BorderLayout(0, 0));
        scrollPane.setViewportView(viewPanel);

        pagePanel = new PagePanel();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        pagePanel.setPreferredSize(screenSize);
        viewPanel.add(pagePanel, BorderLayout.CENTER);

        // disableAllNavigationButton();

        search.addActionListener(new Action1());
    }

    private JButton createButton(String string) {
        return new JButton(string);
    }

    class Action1 implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JDialog jDialog = new JDialog(SwingUtilities.getWindowAncestor(search));
            Label label = new Label("Search: ");
            final JTextField jTextField = new JTextField(10);
            jTextField.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    // Here perform search in PDF
            text = jTextField.getText();
            search(pdfFile,text);
                    System.out.println("Search for text " + jTextField.getText() + " requested");
                }
            });
            // If you want to react to every change of text in the textfield, you can
            // use a DocumentListener and invoke the search method for all events.
            jTextField.getDocument().addDocumentListener(new DocumentListener() {

                @Override
                public void removeUpdate(DocumentEvent e) {

                }

                @Override
                public void insertUpdate(DocumentEvent e) {

                }

                @Override
                public void changedUpdate(DocumentEvent e) {

                }
            });
            JPanel panel = new JPanel();
            jDialog.add(panel);
            panel.add(label);
            panel.add(jTextField);
            jDialog.pack();
            jDialog.setLocationRelativeTo(search);
            jDialog.setVisible(true);
        }
    }

    public static void search(PDFFile pdffile2,String text) {

                System.out.println("Inside searh" +text);
                System.out.println("Inside Search Page ::::::::" + pdffile2.getNumPages()); //43 pages
                for (int i = 0;i <= pdffile2.getNumPages(); i++) {
                PDFPage pdfPage = pdffile2.getPage(i);
                if(pdfPage.equals(text)) {
                    System.out.println("equal");
                }
                else{
                    System.out.println("Not Equal");
                }

                }
            }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new PdfViewer());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

这是一种方法。

  1. 在文本字段中添加ActionListener(每次用户按“Enter”时都会调用actionPerformed
  2. 在文本字段中添加DocumentListener(每次文本字段中的文本发生更改时,都会调用DocumentListener的方法)
  3. 您仍需要在班级中实施搜索方法:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Label;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    import com.google.common.base.CharMatcher;
    import com.sun.pdfview.PDFFile;
    import com.sun.pdfview.PagePanel;
    
    public class PdfViewer extends JPanel {
        private static enum Navigation {
            GO_FIRST_PAGE, FORWARD, BACKWARD, GO_LAST_PAGE, GO_N_PAGE
        }
    
        private static final CharMatcher POSITIVE_DIGITAL = CharMatcher.anyOf("0123456789");
        private static final String GO_PAGE_TEMPLATE = "%s of %s";
        private static final int FIRST_PAGE = 1;
        private int currentPage = FIRST_PAGE;
        private JButton btnFirstPage;
        private JButton btnPreviousPage;
        private JTextField txtGoPage;
        private JButton btnNextPage;
        private JButton btnLastPage;
        private JButton print;
        private JButton search;
        private PagePanel pagePanel;
        private PDFFile pdfFile;
    
        public PdfViewer() {
            initial();
        }
    
        private void initial() {
            setLayout(new BorderLayout(0, 0));
            JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
            add(topPanel, BorderLayout.NORTH);
            btnFirstPage = createButton("|<<");
            topPanel.add(btnFirstPage);
            btnPreviousPage = createButton("<<");
            topPanel.add(btnPreviousPage);
            txtGoPage = new JTextField(10);
            txtGoPage.setHorizontalAlignment(JTextField.CENTER);
            topPanel.add(txtGoPage);
            btnNextPage = createButton(">>");
            topPanel.add(btnNextPage);
            btnLastPage = createButton(">>|");
            topPanel.add(btnLastPage);
    
            search = new JButton("search");
            topPanel.add(search);
            JScrollPane scrollPane = new JScrollPane();
            add(scrollPane, BorderLayout.CENTER);
            JPanel viewPanel = new JPanel(new BorderLayout(0, 0));
            scrollPane.setViewportView(viewPanel);
    
            pagePanel = new PagePanel();
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            pagePanel.setPreferredSize(screenSize);
            viewPanel.add(pagePanel, BorderLayout.CENTER);
    
            // disableAllNavigationButton();
    
            search.addActionListener(new Action1());
        }
    
        private JButton createButton(String string) {
            return new JButton(string);
        }
    
        class Action1 implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialog jDialog = new JDialog(SwingUtilities.getWindowAncestor(search));
                Label label = new Label("Search: ");
                final JTextField jTextField = new JTextField(10);
                jTextField.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // Here perform search in PDF
                        System.out.println("Search for text " + jTextField.getText() + " requested");
                    }
                });
                // If you want to react to every change of text in the textfield, you can
                // use a DocumentListener and invoke the search method for all events.
                jTextField.getDocument().addDocumentListener(new DocumentListener() {
    
                    @Override
                    public void removeUpdate(DocumentEvent e) {
    
                    }
    
                    @Override
                    public void insertUpdate(DocumentEvent e) {
    
                    }
    
                    @Override
                    public void changedUpdate(DocumentEvent e) {
    
                    }
                });
                JPanel panel = new JPanel();
                jDialog.add(panel);
                panel.add(label);
                panel.add(jTextField);
                jDialog.pack();
                jDialog.setLocationRelativeTo(search);
                jDialog.setVisible(true);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new PdfViewer());
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    }