Java 单击JFrame中的搜索按钮不会打开JDialog

Java 单击JFrame中的搜索按钮不会打开JDialog,java,swing,Java,Swing,我有一个带有页面导航按钮、打印、搜索按钮的jframe。当我点击打印按钮时,它完全可以打开窗口,我也可以打印页面。但当我点击搜索按钮时,我无法获得窗口。我的要求是点击搜索按钮应该会打开一个窗口(与打印窗口相同)使用文本字段,当我输入搜索数据时,它应该显示匹配项和未匹配项 我尝试了下面的代码,但没有成功 import com.google.common.base.CharMatcher; import com.sun.pdfview.PDFFile; import com.sun.pdfview.

我有一个带有页面导航按钮、打印、搜索按钮的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();
        }
    }

}
import com.google.common.base.CharMatcher;
导入com.sun.pdfview.PDFFile;
导入com.sun.pdfview.PDFPage;
导入com.sun.pdfview.PDFRenderer;
导入com.sun.pdfview.PagePanel;
导入javax.print.attribute.HashPrintRequestAttributeSet;
导入javax.print.attribute.standard.PageRanges;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.AffineTransform;
导入java.awt.geom.Rectangle2D;
导入java.awt.print.PageFormat;
导入java.awt.print.Printable;
导入java.awt.print.PrinterException;
导入java.awt.print.PrinterJob;
导入java.io.File;
导入java.io.IOException;
导入java.io.RandomAccessFile;
导入java.nio.ByteBuffer;
导入java.nio.channels.FileChannel;
导入静态com.google.common.base.Strings.isNullOrEmpty;
公共类PdfViewer扩展了JPanel{
私有静态枚举导航{
进入第一页,向前,向后,进入最后一页,进入第二页
}
私有静态最终CharMatcher阳_DIGITAL=CharMatcher.anyOf(“0123456789”);
私有静态最终字符串GO_页面_模板=“%s/s”;
专用静态最终int第一页=1;
private int currentPage=第一页;
私人JButton btnFirstPage;
私有JButton btnPreviousPage;
私有JTextField txtGoPage;
私人JButton btnNextPage;
私人JButton btnLastPage;
私人按钮打印;
私有按钮搜索;
专用页面面板页面面板;
私人私人密码;
公共PdfViewer(){
首字母();
}
私人无效首字母(){
setLayout(新边界布局(0,0));
JPanel-topPanel=newjpanel(newflowlayout(FlowLayout.CENTER));
添加(topPanel,BorderLayout.NORTH);
btnFirstPage=createButton(“| |”);
topPanel.add(btnLastPage);
打印=新按钮(“打印”);
topPanel.添加(打印);
搜索=新按钮(“搜索”);
topPanel.add(搜索);
JScrollPane scrollPane=新的JScrollPane();
添加(滚动窗格,BorderLayout.CENTER);
JPanel viewPanel=新的JPanel(新的边界布局(0,0));
scrollPane.setViewportView(viewPanel);
pagePanel=新的pagePanel();
维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
pagePanel.setPreferredSize(屏幕大小);
添加(pagePanel,BorderLayout.CENTER);
禁用导航按钮();
btnFirstPage.addActionListener(新页面导航Listener(Navigation.GO_FIRST_PAGE));
btnPreviousPage.addActionListener(新页面导航Listener(Navigation.BACKWARD));
btnNextPage.addActionListener(新页面导航Listener(Navigation.FORWARD));
btnLastPage.addActionListener(新页面导航Listener(Navigation.GO_最后一页));
addActionListener(新页面导航Listener(Navigation.GO_N_页面));
print.addActionListener(新的PrintUIWindow());
search.addActionListener(新Action1());
}
静态类Action1实现ActionListener{
已执行的公共无效操作(操作事件e){
JFrame父对象=新JFrame();
JDialog JDialog=新JDialog();
标签=新标签(“输入单词:”);
最终JTextField JTextField=新的JTextField(100);
JPanel面板=新的JPanel();
添加(面板);
面板。添加(标签);
panel.add(jTextField);
parent.setLocationRelativeTo(空);
}
}   
私有JButton createButton(字符串文本){
JButton按钮=新JButton(文本);
按钮。设置首选尺寸(新尺寸(55,20));
返回按钮;
}
私有void disableAllNavigationButton(){
btnFirstPage.setEnabled(假);
btnPreviousPage.setEnabled(false);
btnNextPage.setEnabled(false);
btnLastPage.setEnabled(false);
}
私有布尔值IsmorethanePage(PDFFile PDFFile){
返回pdfFile.getNumPages()>1;
}
私有类PageNavigationListener实现ActionListener{
私人最终导航;
专用页面导航侦听器(导航){
这个.导航=导航;
}
已执行的公共无效操作(操作事件e){
如果(Pdfile==null){
返回;
}
int numPages=pdfFile.getNumPages();
if(numPages=1&&pageNumber pdfFile.getNumPages())
不返回此类页面;
Graphics2D g2d=(Graphics2D)图形;
仿射变换at=g2d.getTransform();
PDFPage PDFPage=pdfFile.getPage(pagenum);
尺寸标注;
dim=pdfPage.getUnstretchedSize((int)pageFormat.getImageableWidth(),
(int)pageFormat.getImageableHeight(),
pdfPage.getBBox());
矩形边界=新矩形((int)pageFormat.GetImageTablex(),
(int)pageFormat.getImageTabley(),
宽度,
高度);
PDFRenderer rend=新的PDFRenderer(pdfPage,(Graphics2D)图形、边界、,
空,空);
尝试
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);
      }
    }   
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);