Итак давайте напишим простенькую программку, которая напечатает текст и графику на принтере, для экономии чернил в качестве принтера я буду использовать виртуальный принтер, который печатает в формат PDF.

1. Создадим файл DemoPrinting.java
2. Введём следующий код:

Код:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.print.*;
 
public class DemoPrinting extends JFrame implements Printable, ActionListener {  
        // Массив данных которые мы будем печатать
	private String[][] arrData = {
    {"Январь", "10руб"},
    {"Февраль", "15руб"},    
    {"Март", "2руб"}
	};
	
    // Конструктор, тут инициализация формы
    public DemoPrinting() {
      // Устанавливаем надпись в заголовке окна Демо печати
      setTitle("Демо печати");
      // Устанавлеваем размер окна 
      setSize(640, 480);
      // Без всяких лейаутов
      setLayout(null);
      // Новая кнопка с надписью "Напечатать"
      JButton btnPrint = new JButton("Напечатать");
      // Покуда у нас null layout, то перемещаем кнопку, а так-же изменяем размер кнопки
      btnPrint.setBounds(10, 10, 120, 35);
      // Добавляем обработчик 
      btnPrint.addActionListener(this);
      // Добавляем кнопку в наше окно JFrame
      add(btnPrint);
      // Устанавливаем обработчик при нажатие на кнопку закрыть окно, т.е. X
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // Отображаем форму
      setVisible(true);
   }

    // Печать
    public int print(Graphics g, PageFormat pgfmt, int page) {
      try {
        if (page > 0) 
          return NO_SUCH_PAGE;
    int intPosY = 0;
        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pgfmt.getImageableX(), pgfmt.getImageableY());
        g.drawString("Тут заголовок!", 100, 100);
    for(String[] el : arrData) {
    	g.drawString(el[0], 100, intPosY + 120);
    	g.drawString(el[1], 200, intPosY + 120);
    	intPosY += 10;
    }
    
      }
      catch(Exception ex) { return NO_SUCH_PAGE; }

    return PAGE_EXISTS;
    }
 
    // Тут запускается...
    public static void main(String args[]) {
        // Создаём форму
        new DemoPrinting();
    }
	
    // Обработчик событий при нажатие на кнопку "Печать"
    public void actionPerformed(ActionEvent e) {
	PrinterJob job = PrinterJob.getPrinterJob();
	job.setPrintable((Printable)this);
	if(job.printDialog()) {
    try {
    	job.print();
    } 
    catch (PrinterException ex) { }
        }
    }
}

3. Откомпилируем  javac -encoding utf8 DemoPrinting.java
4. Если всё откомпилировалось, запустим нашу программу java DemoPrinting, вы увидите такой экран, конечно я размеры уменьшил:
https://i.ibb.co/dpQzTvZ/java-print-dialog-18-30-15-06-2021-min.jpg

После печати выглядет так, у меня виртуальный принтер, который печатает в PDF:
https://i.ibb.co/x3v9jGH/java-print-res-18-30-15-06-2021-min.jpg