2012-11-09 3 views
0

Java GUI로 작업 중이며 단일 패널로 인쇄하려고합니다. 나에게 메시지가 나타나면 인쇄 할 것이 있습니다. 그러나 문제는 무엇인가가 빈 페이지라는 것입니다. 다음은 Java GUI 인쇄 빈 페이지

는 모든 관련 코드 :

public class DrawPanel extends JPanel implements MouseMotionListener, Printable { 

...

public void print(){ 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintable(this); 
     if(job.printDialog()){ 
      try{ 
       job.print(); 
      }catch(PrinterException e){ 
       System.err.print("Print failed: " + e);} 

     } 
    } 

...

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) 
      throws PrinterException { 
     if(pageIndex > 0){ 
      return NO_SUCH_PAGE; 
     } 

     Graphics2D g = (Graphics2D)graphics; 
     g.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
     this.setDoubleBuffered(false); 
     this.paint(g); 

     return PAGE_EXISTS; 

    } 

하고 함수를 호출하는 다른 객체 :

if(evt.getSource() == btn_print){ 

    p.print(); 

} 

답변

1
public class PrintView extends FrameView implements Printable,ActionListener{ 

public PrintView(SingleFrameApplication app) throws PrinterException { 
    super(app); 

    initComponents(); 

    jButton1.addActionListener(this); 


    // status bar initialization - message timeout, idle icon and busy animation, etc 
    ResourceMap resourceMap = getResourceMap(); 
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout"); 
    messageTimer = new Timer(messageTimeout, new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      statusMessageLabel.setText(""); 
     } 
    }); 
    messageTimer.setRepeats(false); 
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate"); 
    for (int i = 0; i < busyIcons.length; i++) { 
     busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"); 
    } 
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      busyIconIndex = (busyIconIndex + 1) % busyIcons.length; 
      statusAnimationLabel.setIcon(busyIcons[busyIconIndex]); 
     } 
    }); 
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon"); 
    statusAnimationLabel.setIcon(idleIcon); 
    progressBar.setVisible(false); 

    // connecting action tasks to status bar via TaskMonitor 
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext()); 
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() { 
     public void propertyChange(java.beans.PropertyChangeEvent evt) { 
      String propertyName = evt.getPropertyName(); 
      if ("started".equals(propertyName)) { 
       if (!busyIconTimer.isRunning()) { 
        statusAnimationLabel.setIcon(busyIcons[0]); 
        busyIconIndex = 0; 
        busyIconTimer.start(); 
       } 
       progressBar.setVisible(true); 
       progressBar.setIndeterminate(true); 
      } else if ("done".equals(propertyName)) { 
       busyIconTimer.stop(); 
       statusAnimationLabel.setIcon(idleIcon); 
       progressBar.setVisible(false); 
       progressBar.setValue(0); 
      } else if ("message".equals(propertyName)) { 
       String text = (String)(evt.getNewValue()); 
       statusMessageLabel.setText((text == null) ? "" : text); 
       messageTimer.restart(); 
      } else if ("progress".equals(propertyName)) { 
       int value = (Integer)(evt.getNewValue()); 
       progressBar.setVisible(true); 
       progressBar.setIndeterminate(false); 
       progressBar.setValue(value); 
      } 
     } 
    }); 
} 

@Action 
public void showAboutBox() { 
    if (aboutBox == null) { 
     JFrame mainFrame = PrintApp.getApplication().getMainFrame(); 
     aboutBox = new PrintAboutBox(mainFrame); 
     aboutBox.setLocationRelativeTo(mainFrame); 
    } 
    PrintApp.getApplication().show(aboutBox); 
} 

/** This method is called from within the constructor to 
* initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is 
* always regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    mainPanel = new javax.swing.JPanel(); 
    jButton1 = new javax.swing.JButton(); 
    jPanel1 = new javax.swing.JPanel(); 
    jLabel1 = new javax.swing.JLabel(); 
    jComboBox1 = new javax.swing.JComboBox(); 
    jSlider1 = new javax.swing.JSlider(); 
    jProgressBar1 = new javax.swing.JProgressBar(); 
    jPasswordField1 = new javax.swing.JPasswordField(); 
    menuBar = new javax.swing.JMenuBar(); 
    javax.swing.JMenu fileMenu = new javax.swing.JMenu(); 
    javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); 
    javax.swing.JMenu helpMenu = new javax.swing.JMenu(); 
    javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem(); 
    statusPanel = new javax.swing.JPanel(); 
    javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator(); 
    statusMessageLabel = new javax.swing.JLabel(); 
    statusAnimationLabel = new javax.swing.JLabel(); 
    progressBar = new javax.swing.JProgressBar(); 

    mainPanel.setName("mainPanel"); // NOI18N 

    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(print.PrintApp.class).getContext().getResourceMap(PrintView.class); 
    jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N 
    jButton1.setName("jButton1"); // NOI18N 

    jPanel1.setBorder(new javax.swing.border.MatteBorder(null)); 
    jPanel1.setName("jPanel1"); // NOI18N 

    jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N 
    jLabel1.setName("jLabel1"); // NOI18N 

    jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1", "2", "3", "4" })); 
    jComboBox1.setName("jComboBox1"); // NOI18N 

    jSlider1.setName("jSlider1"); // NOI18N 

    jProgressBar1.setName("jProgressBar1"); // NOI18N 

    jPasswordField1.setText(resourceMap.getString("jPasswordField1.text")); // NOI18N 
    jPasswordField1.setName("jPasswordField1"); // NOI18N 

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addGap(371, 371, 371) 
      .addComponent(jLabel1) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 280, Short.MAX_VALUE) 
      .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(133, 133, 133)) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 
      .addContainerGap(233, Short.MAX_VALUE) 
      .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(185, 185, 185) 
      .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(97, 97, 97)) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 
      .addContainerGap(486, Short.MAX_VALUE) 
      .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(264, 264, 264)) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addGap(49, 49, 49) 
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
       .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jLabel1)) 
      .addGap(62, 62, 62) 
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
       .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 60, Short.MAX_VALUE) 
      .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(32, 32, 32)) 
    ); 

    javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); 
    mainPanel.setLayout(mainPanelLayout); 
    mainPanelLayout.setHorizontalGroup(
     mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(mainPanelLayout.createSequentialGroup() 
      .addGap(446, 446, 446) 
      .addComponent(jButton1) 
      .addContainerGap(466, Short.MAX_VALUE)) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() 
      .addContainerGap(66, Short.MAX_VALUE) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(46, 46, 46)) 
    ); 
    mainPanelLayout.setVerticalGroup(
     mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(mainPanelLayout.createSequentialGroup() 
      .addGap(107, 107, 107) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE) 
      .addComponent(jButton1) 
      .addGap(56, 56, 56)) 
    ); 

    menuBar.setName("menuBar"); // NOI18N 

    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N 
    fileMenu.setName("fileMenu"); // NOI18N 

    javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(print.PrintApp.class).getContext().getActionMap(PrintView.class, this); 
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N 
    exitMenuItem.setName("exitMenuItem"); // NOI18N 
    fileMenu.add(exitMenuItem); 

    menuBar.add(fileMenu); 

    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N 
    helpMenu.setName("helpMenu"); // NOI18N 

    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N 
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N 
    helpMenu.add(aboutMenuItem); 

    menuBar.add(helpMenu); 

    statusPanel.setName("statusPanel"); // NOI18N 

    statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N 

    statusMessageLabel.setName("statusMessageLabel"); // NOI18N 

    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); 
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N 

    progressBar.setName("progressBar"); // NOI18N 

    javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel); 
    statusPanel.setLayout(statusPanelLayout); 
    statusPanelLayout.setHorizontalGroup(
     statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 975, Short.MAX_VALUE) 
     .addGroup(statusPanelLayout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(statusMessageLabel) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 805, Short.MAX_VALUE) 
      .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(statusAnimationLabel) 
      .addContainerGap()) 
    ); 
    statusPanelLayout.setVerticalGroup(
     statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(statusPanelLayout.createSequentialGroup() 
      .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(statusMessageLabel) 
       .addComponent(statusAnimationLabel) 
       .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addGap(3, 3, 3)) 
    ); 

    setComponent(mainPanel); 
    setMenuBar(menuBar); 
    setStatusBar(statusPanel); 
}// </editor-fold>       

// Variables declaration - do not modify      
private javax.swing.JButton jButton1; 
private javax.swing.JComboBox jComboBox1; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JPanel jPanel1; 
private javax.swing.JPasswordField jPasswordField1; 
private javax.swing.JProgressBar jProgressBar1; 
private javax.swing.JSlider jSlider1; 
private javax.swing.JPanel mainPanel; 
private javax.swing.JMenuBar menuBar; 
private javax.swing.JProgressBar progressBar; 
private javax.swing.JLabel statusAnimationLabel; 
private javax.swing.JLabel statusMessageLabel; 
private javax.swing.JPanel statusPanel; 
// End of variables declaration     

private final Timer messageTimer; 
private final Timer busyIconTimer; 
private final Icon idleIcon; 
private final Icon[] busyIcons = new Icon[15]; 
private int busyIconIndex = 0; 

private JDialog aboutBox; 
public void actionPerformed(ActionEvent e) 
{ 
    if(e.getActionCommand().equals("PRINT")) 
    { 
      PrinterJob job = PrinterJob.getPrinterJob(); 
    job.setPrintable(this); 
    boolean ok = job.printDialog(); 
     if (ok) 
     { 
      try 
      { 
       job.print(); 
      } 
      catch (PrinterException ex) 
      { 
      /* The job did not successfully complete */ 
      } 
     } 
    } 
} 
public int print(Graphics g, PageFormat pf, int page) throws 
                PrinterException { 

    if (page > 0) { /* We have only one page, and 'page' is zero-based */ 
     return NO_SUCH_PAGE; 
    } 

    /* User (0,0) is typically outside the imageable area, so we must 
    * translate by the X and Y values in the PageFormat to avoid clipping 
    */ 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.translate(pf.getImageableX(), pf.getImageableY()); 

    /* Now print the window and its visible contents */ 
    // jPanel1.printAll(g); 
    jPanel1.paint(g2d); 
    jPanel1.repaint(); 
    /* tell the caller that this page is part of the printed document */ 
    return PAGE_EXISTS; 
} 
} 
+0

흠, 여기있는 것처럼 페인트 칠을 추가하려고했지만 도움이되지 않았습니다. 여전히 빈 페이지가 나타납니다. 이 모든 것이 JPanel 클래스의 클래스에 있어야합니까? 그게 내가하고있는 일이기 때문이야. 나는 this.paint (g2d)를 호출한다. and this.repaint(); – user1706538

+0

이것을 사용하지 마십시오. jpanel.repaint()를 사용하십시오. 이것은 (현재) 현재 컨텍스트를 참조합니다. 따라서 jpanel을 인쇄해야하는 경우 jpanel.paint (2d)를 사용하십시오. 및 jpanel.repaint(). 나는 위와 그것을 시도하고 작동합니다. – Raghunandan

+0

jpanel.paint를 호출하면 비 정적 메서드에 대한 정적 참조를 만드는 중 오류가 발생합니다. 인스턴스에서 호출 할 의도가 없다고 확신합니까? – user1706538