Как распечатать распашное окно, чтобы оно уместилось на одной странице? - PullRequest
5 голосов
/ 31 марта 2011

Я пытаюсь добавить функциональность печати в наш пользовательский интерфейс Swing. Я попробовал следующее:

protected void print() {
    PrinterJob job = PrinterJob.getPrinterJob();
    if(job.printDialog()){
      try {
        job.setPrintable(new Printable() {

          @Override
          public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if(pageIndex == 0){
              Graphics2D g2d = (Graphics2D)graphics;
              g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

//              BufferedImage snapshot = AnimUtilities.createSnapshotOfFrame(ApplicationFrame.this, Transparency.TRANSLUCENT);
//              double scaleX = pageFormat.getWidth()/snapshot.getWidth();
//              double scaleY = pageFormat.getHeight()/snapshot.getHeight();
//              
//              double scaleValue = Math.min(scaleX, scaleY);
//              g2d.scale(scaleValue, scaleValue);
//              g2d.drawImage(snapshot, 0, 0, snapshot.getWidth(), snapshot.getHeight(), ApplicationFrame.this);
//              ApplicationFrame.this.print(g2d);
              ApplicationFrame.this.printAll(g2d);
              return PAGE_EXISTS;
            }
            return NO_SUCH_PAGE;
          }
        });
        job.print();
      } catch (PrinterException e) {
        e.printStackTrace();
      }
    } else {
      System.err.println("Error printing");
    }
  }

Код, который не закомментирован, работает очень хорошо, потому что напечатанное выглядит очень хорошо на бумаге. Тем не менее, JFrame больше, чем бумага, поэтому он просто обрезает ее. Я также попробовал закомментированный код, который создает изображение JFrame, масштабирует изображение соответствующим образом, чтобы оно помещалось на странице и сохраняло такое же соотношение сторон, но масштабирование делает текст на экране ужасным. Я нашел этот расширенный учебник от Oracle , но он рассказывает, как разбить экран на несколько страниц. Я просто хочу напечатать хороший скриншот JFrame. Как я могу напечатать JFrame, не обрезая его и не вызывая артефактов от масштабирования?

1 Ответ

4 голосов
/ 31 марта 2011

Вы можете получить некоторую выгоду от RenderingHints.Я бы посмотрел на KEY_ANTIALIASING, KEY_TEXT_ANTIALIASING и KEY_FRACTIONALMETRICS в частности.

Редактировать:

RenderingHints.KEY_INTERPOLATION также помогает, и AffineTransformOp.TYPE_BICUBIC является другой альтернативой.

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