когда в этом коде вызывается метод print интерфейса для печати и ...? - PullRequest
1 голос
/ 06 июля 2011
// Program to print simple text on a Printer

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.PrinterException;
import java.awt.print.*;

class Printer extends JPanel implements Printable  {

  JButton print;

  Printer() {
    buildGUI();
    hookUpEvents();
  }

  public void buildGUI() {
    JFrame fr = new JFrame("Program to Print on a Printer");
    JPanel p = new JPanel();
    print = new JButton("Print");
    setPreferredSize( new Dimension ( 200,200 ) );
    p.setBackground( Color.black );
    fr.add(p);
    p.add( print , BorderLayout.CENTER );
    fr.pack();
    fr.setVisible( true );
  }

  public void hookUpEvents() {
    print.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent ae ) {
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintable( new Printer() );
        boolean doPrint = job.printDialog();
        if( doPrint ) {
          try {
            job.print();
          } catch( PrinterException exc) {
            System.out.println( exc );
          }
        } else {
          System.out.println("You cancelled the print");
        } 
      }
    });
  }

  public int print( Graphics g , PageFormat pf , int pageIndex) throws PrinterException{
    Graphics2D g2d = (Graphics2D)g;
    g2d.translate(pf.getImageableX(), pf.getImageableY());
    g.drawString( "testing..." , 100 , 100 );
    return PAGE_EXISTS;
  }

  public static void main( String args[] ) {
    new Printer();
  }
}

После команды java Printer вывод:

enter image description here

Но когда я нажму на печать, появится следующее окно:

enter image description here

я снова получаю прежнее окно. Почему это происходит?

Когда в этой программе вызывается метод print для Printable interface?

Почему мой размер окна становится таким маленьким, когда я установил = 200,200.

1 Ответ

2 голосов
/ 06 июля 2011

Хорошо, у вас было три вопроса:

Первый: Причина, по которой ваше окно маленькое, заключается в том, что вы используете jf.pack () вместе с макетом границы,что делает ваш JFrame размером, необходимым для отображения всего компонента, который он содержит, без дополнительного пространства вокруг.Вы можете установить макет в null и потерять часть jf.pack (), но это обычно не рекомендуемая практика.

Second: Окно всплывает во второй раз, потому что вы 'там создается второй экземпляр того же объекта в вашем слушателе:

job.setPrintable( new Printer() );

Часть "new Printer ()" создает другой объект Printer, который снова вызывает создание пользовательского интерфейса и т. д.

Вы можете создать внутренний класс вместо анонимного, чтобы иметь возможность использовать this для ссылки на текущий объект Printer.

Ваш метод hookUpEvents () будет выглядеть примерно так:

public void hookUpEvents() {
  MyActionListener mal = new MyActionListener();
  print.addActionListener(mal); {
}

Затем, где-нибудь еще в том же классе создайте внутренний класс следующим образом:

private class MyActionListener implements ActionListener{
  public void actionPerformed(ActionEvent ae) {
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(Printer.this);
    boolean doPrint = job.printDialog();
     if( doPrint ) {
       try {
        job.print();
       }  
       catch( PrinterException exc) {
           System.out.println( exc );
       }
     }  
     else {
        System.out.println("You cancelled the print"); 
      } 
    }
}

Третий: Метод print () вызывается, когдавы вводите: "job.print ()", так как вы переопределяете метод из интерфейса.Тот, что в интерфейсе, на самом деле никогда не вызывается, так как вместо него вызывается ваш, что вы и хотите, поскольку вы определили, что он должен был делать.

Надеюсь, теперь это отвечает на ваши вопросы.

Редактировать: Я только что протестировал нечто подобное, и я думаю, что вы можете просто напечатать Printer.this в анонимном классе, чтобы заставить его работать, вместо создания внутреннего класса, который заставил бы вас изменить намного меньше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...