-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 に答える