-1

我有一个带有页面导航按钮、打印、搜索按钮的 jframe。当我点击打印按钮时,它完全打开了窗口,我也可以打印页面。但是当我点击搜索按钮时,我无法获得窗口。我的要求是单击“搜索”按钮应该打开一个带有文本字段的窗口(与打印窗口相同),当我输入搜索数据时,它应该显示匹配项和不匹配项。

我已经尝试了下面的代码,但我没有成功。

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

import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.PageRanges;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import static com.google.common.base.Strings.isNullOrEmpty;

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);
        print = new JButton("print");
        topPanel.add(print);
        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));
        print.addActionListener(new PrintUIWindow());
        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("Enter Word: ");
              final JTextField jTextField = new JTextField(100);
              JPanel panel = new JPanel();
              parent.add(panel);
              panel.add(label);
              panel.add(jTextField);
              parent.setLocationRelativeTo(null);
          }
        }   

    private JButton createButton(String text) {
        JButton button = new JButton(text);
        button.setPreferredSize(new Dimension(55, 20));

        return button;
    }

    private void disableAllNavigationButton() {
        btnFirstPage.setEnabled(false);
        btnPreviousPage.setEnabled(false);
        btnNextPage.setEnabled(false);
        btnLastPage.setEnabled(false);
    }

    private boolean isMoreThanOnePage(PDFFile pdfFile) {
        return pdfFile.getNumPages() > 1;
    }

    private class PageNavigationListener implements ActionListener {
        private final Navigation navigation;

        private PageNavigationListener(Navigation navigation) {
            this.navigation = navigation;
        }

        public void actionPerformed(ActionEvent e) {
            if (pdfFile == null) {
                return;
            }

            int numPages = pdfFile.getNumPages();
            if (numPages <= 1) {
                disableAllNavigationButton();
            } else {
                if (navigation == Navigation.FORWARD && hasNextPage(numPages)) {
                    goPage(currentPage, numPages);
                }

                if (navigation == Navigation.GO_LAST_PAGE) {
                    goPage(numPages, numPages);
                }

                if (navigation == Navigation.BACKWARD && hasPreviousPage()) {
                    goPage(currentPage, numPages);
                }

                if (navigation == Navigation.GO_FIRST_PAGE) {
                    goPage(FIRST_PAGE, numPages);
                }

                if (navigation == Navigation.GO_N_PAGE) {
                    String text = txtGoPage.getText();
                    boolean isValid = false;
                    if (!isNullOrEmpty(text)) {
                        boolean isNumber = POSITIVE_DIGITAL.matchesAllOf(text);
                        if (isNumber) {
                            int pageNumber = Integer.valueOf(text);
                            if (pageNumber >= 1 && pageNumber <= numPages) {
                                goPage(Integer.valueOf(text), numPages);
                                isValid = true;
                            }
                        }
                    }

                    if (!isValid) {
                        JOptionPane.showMessageDialog(PdfViewer.this,
                                format("Invalid page number '%s' in this document", text));
                        txtGoPage.setText(format(GO_PAGE_TEMPLATE, currentPage, numPages));
                    }
                }
            }
        }

        private void goPage(int pageNumber, int numPages) {
            currentPage = pageNumber;
            PDFPage page = pdfFile.getPage(currentPage);
            pagePanel.showPage(page);
            boolean notFirstPage = isNotFirstPage();
            btnFirstPage.setEnabled(notFirstPage);
            btnPreviousPage.setEnabled(notFirstPage);
            txtGoPage.setText(format(GO_PAGE_TEMPLATE, currentPage, numPages));
            boolean notLastPage = isNotLastPage(numPages);
            btnNextPage.setEnabled(notLastPage);
            btnLastPage.setEnabled(notLastPage);
        }

        private boolean hasNextPage(int numPages) {
            return (++currentPage) <= numPages;
        }

        private boolean hasPreviousPage() {
            return (--currentPage) >= FIRST_PAGE;
        }

        private boolean isNotLastPage(int numPages) {
            return currentPage != numPages;
        }

        private boolean isNotFirstPage() {
            return currentPage != FIRST_PAGE;
        }
    }

    private class PrintUIWindow implements Printable, ActionListener {

        /*
         * (non-Javadoc)
         * 
         * @see java.awt.print.Printable#print(java.awt.Graphics,
         * java.awt.print.PageFormat, int)
         */
        @Override
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            int pagenum = pageIndex+1;
              if (pagenum < 1 || pagenum > pdfFile.getNumPages ())
                  return NO_SUCH_PAGE;

              Graphics2D g2d = (Graphics2D) graphics;
              AffineTransform at = g2d.getTransform ();

              PDFPage pdfPage = pdfFile.getPage (pagenum);

              Dimension dim;
              dim = pdfPage.getUnstretchedSize ((int) pageFormat.getImageableWidth (),
                                                (int) pageFormat.getImageableHeight (),
                                                pdfPage.getBBox ());

              Rectangle bounds = new Rectangle ((int) pageFormat.getImageableX (),
                                                (int) pageFormat.getImageableY (),
                                                dim.width,
                                                dim.height);

              PDFRenderer rend = new PDFRenderer (pdfPage, (Graphics2D) graphics, bounds,
                                                  null, null);
              try
              {
                  pdfPage.waitForFinish ();
                  rend.run ();
              }
              catch (InterruptedException ie)
              {
                  //JOptionPane.showMessageDialog (this, ie.getMessage ());
              }

              g2d.setTransform (at);
              g2d.draw (new Rectangle2D.Double (pageFormat.getImageableX (),
                      pageFormat.getImageableY (),
                      pageFormat.getImageableWidth (),
                      pageFormat.getImageableHeight ()));

              return PAGE_EXISTS;
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
         * )
         */
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Inside action performed");
            PrinterJob printJob = PrinterJob.getPrinterJob();
            printJob.setPrintable(this);
             try
              {
                  HashPrintRequestAttributeSet attset;
                  attset = new HashPrintRequestAttributeSet ();
                  //attset.add (new PageRanges (1, pdfFile.getNumPages ()));
                  if (printJob.printDialog (attset))
                      printJob.print (attset);
              }
              catch (PrinterException pe)
              {
                  //JOptionPane.showMessageDialog (this, pe.getMessage ());
              }

        }

    }

    public PagePanel getPagePanel() {
        return pagePanel;
    }

    public void setPDFFile(PDFFile pdfFile) {
        this.pdfFile = pdfFile;
        currentPage = FIRST_PAGE;
        disableAllNavigationButton();
        txtGoPage.setText(format(GO_PAGE_TEMPLATE, FIRST_PAGE, pdfFile.getNumPages()));
        boolean moreThanOnePage = isMoreThanOnePage(pdfFile);
        btnNextPage.setEnabled(moreThanOnePage);
        btnLastPage.setEnabled(moreThanOnePage);
    }

    public static String format(String template, Object... args) {
        template = String.valueOf(template); // null -> "null"
        // start substituting the arguments into the '%s' placeholders
        StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
        int templateStart = 0;
        int i = 0;
        while (i < args.length) {
            int placeholderStart = template.indexOf("%s", templateStart);
            if (placeholderStart == -1) {
                break;
            }
            builder.append(template.substring(templateStart, placeholderStart));
            builder.append(args[i++]);
            templateStart = placeholderStart + 2;
        }
        builder.append(template.substring(templateStart));

        // if we run out of placeholders, append the extra args in square braces
        if (i < args.length) {
            builder.append(" [");
            builder.append(args[i++]);
            while (i < args.length) {
                builder.append(", ");
                builder.append(args[i++]);
            }
            builder.append(']');
        }

        return builder.toString();
    }

    public static void main(String[] args) {
        try {
            long heapSize = Runtime.getRuntime().totalMemory();
            System.out.println("Heap Size = " + heapSize);

            JFrame frame = new JFrame("PDF Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // load a pdf from a byte buffer
            File file = new File("/home/swarupa/Downloads/2626OS-Chapter-5-Advanced-Theme.pdf");
            RandomAccessFile raf = new RandomAccessFile(file, "r");
            FileChannel channel = raf.getChannel();
            ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            final PDFFile pdffile = new PDFFile(buf);
            PdfViewer pdfViewer = new PdfViewer();
            pdfViewer.setPDFFile(pdffile);
            frame.add(pdfViewer);
            frame.pack();
            frame.setVisible(true);

            PDFPage page = pdffile.getPage(0);
            pdfViewer.getPagePanel().showPage(page);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我在哪里做错了。任何人都可以指出我。

4

3 回答 3

2

我认为,这应该可以解决您的问题;) 您忘记将窗口设置为可见 :)

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

顺便说一句,你为什么要创建那个 JDialog?

于 2013-01-25T10:25:54.627 回答
1

你创造了JDialogJFrame为什么?你从不调用 setVisible(true),为什么?

您对 Action1 的期望是什么?

于 2013-01-25T10:24:13.803 回答
0

很抱歉将此答案作为新帖子发布到您的评论中,但是将其发布为评论太长了。您只是无法从 JFrame 中删除关闭和最小化按钮。如果您想要一些没有这些按钮的窗口,您必须创建和自定义您自己的 JDialog。尽管如此,仍然会有一个关闭按钮 (X)。当你实现这样的东西时,你可以让你的 JDialog 不加修饰并让它表现得更像 JFrame:

class CustomizedDialog extends JDialog {
public CustomizedDialog(JFrame frame, String str) {
    super(frame, str);
    super.setUndecorated(true);
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent evt) {
            System.exit(0);
        }
    });
}

}

然后你可以在你的代码中调用它:

CustomizedDialog myCustomizedDialog = new CustomizedDialog(new JFrame(), "My title");
JPanel panel = new JPanel();
panel.setSize(256, 256);
myCustomizedDialog.add(panel);
myCustomizedDialog.setSize(256, 256);
myCustomizedDialog.setLocationRelativeTo(null);
myCustomizedDialog.setVisible(true);

我希望这有帮助 :)

于 2013-01-25T11:21:55.887 回答