title: How to prevent JPanel from resizing to fill JScrollPane
body: <p>Using Java, I am creating a form with GridBagLayout. the GUI is inside a JPanel, which is inside a scrollPane which is added to a JFrame. </p>
  
  <p>I want the JPanel with the GUI to be a fixed size to prevent the form being stretched, however, I would like the JScrollPanel to be resizable for the user's preference. (Similar to MS Paint, with the canvas being my JPanel). The reason I want to prevent the form from being stretched is because I want it to print and from the way I have it now, the printed form prints pretty much the way I want it, but alters unfavorably if the frame as been resized prior to printing.</p>
  
  <p>Perhaps my problem is better to be solved in the way I print, but the problem is that I have never dealt with this level of printing before and was unable to find similar questions/tutorials to help me solve my problem. The direction I am going may be "the poor man's way" of doing it, but its the only one that makes sense to me right now, I'm a fairly novice Java programmer. </p>
  
  <p><strong>FrontierMain.java</strong></p>
  
  <pre><code>public class FrontierMain  {
  
  public FrontierMain(){
      JFrame frame = new JFrame();
      frame.setTitle("Frontier Insulation Labor Record Tool");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      LaborRecordPanel recordPanel = new LaborRecordPanel();
      frame.add(recordPanel.scrollPane);
      frame.pack();
      frame.setVisible(true);
  
  }
  
  public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable(){
          public void run(){
              FrontierMain fm = new FrontierMain();   
          }
      });
  
      System.out.println("Hello, World");
  }
  }
  </code></pre>
  
  <p><strong>LaborRecordPanel.java</strong>
  </p>
  
  <pre><code>public class LaborRecordPanel implements
  Printable, ActionListener {
  
      private Color shade = new Color(201,201,201); // color for shaded cells
  
      private JLabel dateSpace[] = new JLabel[7]; 
      private JLabel grandTotalSpace = new JLabel();
      private JLabel locAndDescSpace = new JLabel();
      private JLabel personnelSpace[] = new JLabel[10]; //  empty cells
      private JLabel calendarGridLines[] = new JLabel[300]; //empty labels for gridlines
  
      private ImageIcon logoIcon = new ImageIcon("Images/fici_logo1.jpg");
      private JLabel logoLabel = new JLabel(logoIcon);
  
      private JLabel authorizedBy = new JLabel("AUTHORIZED BY:");
      private JLabel toCertify = new JLabel("THIS IS TO CERTIFY THAT THE ABOVE LABOR HAS BEEN PERFORMED.");
  
      private JLabel laborRecordNO = new JLabel("NO.");
      private JLabel nameOfJob = new JLabel("NAME OF JOB:");
      private JLabel customerPO = new JLabel("CUSTOMER PO #:");
      private JLabel contractNO = new JLabel("CONTRACT NO.");
      private JLabel weekEnding = new JLabel("WEEK ENDING");
  
      private JLabel personnelList = new JLabel("&lt;html&gt;LIST SUPERVISION &amp;&lt;br&gt; CRAFT LABOR BELOW:&lt;/html&gt;");
      private JLabel locAndDescriptionLabel = new JLabel("LOCATION AND DESCRIPTION:");
  
      private JLabel personnelTitle = new JLabel("TITLE");
      private JLabel supt = new JLabel("SUPT.");
      private JLabel foreman = new JLabel("FOREMAN");
      private JLabel[] mechanic= new JLabel[8];
  
      private JLabel calendarTitle = new JLabel("NUMBER OF HOURS WORKED @ SITE");
      private JLabel dayHeading = new JLabel("DAY");
      private JLabel dateHeading = new JLabel("DATE");
      private JLabel[] ot2 = new JLabel[10];
      private JLabel[] ot1 = new JLabel[10];
      private JLabel[] st = new JLabel[10];
  
      private JLabel mon = new JLabel("MON");
      private JLabel tues = new JLabel("TUES");
      private JLabel wed = new JLabel("WED");
      private JLabel thur = new JLabel("THUR");
      private JLabel fri = new JLabel("FRI");
      private JLabel sat = new JLabel("SAT");
      private JLabel sun = new JLabel("SUN");
  
      private JLabel totalHours = new JLabel("&lt;html&gt;TOTAL&lt;br&gt; HOURS&lt;/html&gt;");
      private JLabel ratePerHour = new JLabel("&lt;html&gt;RATE&lt;br&gt; PER&lt;br&gt; HOUR&lt;/html&gt;");
      private JLabel totalAmount = new JLabel("&lt;html&gt;TOTAL&lt;br&gt; AMOUNT&lt;/html&gt;");
      private JLabel grandTotal = new JLabel("TOTAL");
  
      JPanel rp = new JPanel();
      JScrollPane scrollPane = new JScrollPane(rp);
  
      LaborRecordPanel(){
  
          rp.setPreferredSize(new Dimension(1295,1830 ));
          rp.setMinimumSize(new Dimension(1295,1830 ));
          rp.setMaximumSize(new Dimension(1295,1830 ));
          scrollPane.setPreferredSize(new Dimension(900,700 ));
  
          scrollPane.getVerticalScrollBar().setUnitIncrement(16); //increase the scroll speed
  
          for (int i = 0; i &lt;= 7; i++) mechanic[i] = new JLabel("MECHANIC"); // create mechanic labels
  
          for (int i = 0; i &lt;= 9; i++) //create labels for work time
          {
              ot2[i] = new JLabel("OT-2");
              ot1[i] = new JLabel("OT-1");
              st[i] = new JLabel("S.T.");
          }
          //create empty labels for gridlines
          for (int i = 0; i &lt;= 9; i++) personnelSpace[i] = new JLabel(); 
          for (int i = 0; i &lt;= 6; i++) dateSpace[i] = new JLabel();
          for (int i = 0; i &lt;= 299; i++) calendarGridLines[i] = new JLabel();
  
          GridBagLayout gridbag = new GridBagLayout();
          rp.setBackground(Color.WHITE);
          rp.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
          GridBagConstraints gbc = new GridBagConstraints();
          rp.setLayout(gridbag);
          //gbc.insets = new Insets(5, 5, 5, 5);
  
          //row 0////////////////////////////////////////////////////////////
          gbc.fill = GridBagConstraints.BOTH;
          gbc.gridx = 10;
          gbc.gridy = 0;
          gbc.weightx = 1;
          gbc.weighty = 1;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          laborRecordNO.setHorizontalAlignment(JLabel.CENTER);
          laborRecordNO.setFont(new Font("Dialog", Font.PLAIN, 18));
          gridbag.setConstraints(laborRecordNO, gbc);
          rp.add(laborRecordNO, gbc);
  
          //row 1////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 1;
          gbc.gridwidth = 13;
          gridbag.setConstraints(logoLabel, gbc);
          rp.add(logoLabel, gbc);
  
          //row 2////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 2;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          nameOfJob.setFont(nameOfJob.getFont().deriveFont(18.0f));
          gridbag.setConstraints(nameOfJob, gbc);
          rp.add(nameOfJob, gbc);
  
          gbc.gridx = 6;
          gbc.gridy = 2;
          gbc.gridheight = 1;
          gbc.gridwidth = 3;
          contractNO.setFont(contractNO.getFont().deriveFont(18.0f));
          gridbag.setConstraints(contractNO, gbc);
          rp.add(contractNO, gbc);
  
          //row 3////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 3;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          customerPO.setFont(customerPO.getFont().deriveFont(18.0f));
          gridbag.setConstraints(customerPO, gbc);
          rp.add(customerPO, gbc);
  
          gbc.gridx = 6;
          gbc.gridy = 3;
          gbc.gridheight = 1;
          gbc.gridwidth = 3;
          weekEnding.setFont(weekEnding.getFont().deriveFont(18.0f));
          gridbag.setConstraints(weekEnding, gbc);
          rp.add(weekEnding, gbc);
  
          //row 4////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 4;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          personnelList.setHorizontalAlignment(JLabel.CENTER);
          personnelList.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
          personnelList.setFont(personnelList.getFont().deriveFont(18.0f));
          gridbag.setConstraints(personnelList, gbc);
          rp.add(personnelList, gbc);
  
          gbc.gridx = 1;
          gbc.gridy = 4;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          personnelTitle.setHorizontalAlignment(JLabel.CENTER);
          personnelTitle.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.BLACK));
          personnelTitle.setFont(personnelTitle.getFont().deriveFont(18.0f));
          gridbag.setConstraints(personnelTitle, gbc);
          rp.add(personnelTitle, gbc);
  
          gbc.gridx = 2;
          gbc.gridy = 4;
          gbc.gridwidth = 8;
          gbc.gridheight = 1;
          calendarTitle.setHorizontalAlignment(JLabel.CENTER);
          calendarTitle.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.BLACK));
          calendarTitle.setFont(calendarTitle.getFont().deriveFont(18.0f));
          gridbag.setConstraints(calendarTitle, gbc);
          rp.add(calendarTitle, gbc);
  
          gbc.gridx = 10;
          gbc.gridy = 4;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          totalHours.setHorizontalAlignment(JLabel.CENTER);
          totalHours.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
          totalHours.setFont(totalHours.getFont().deriveFont(18.0f));
          gridbag.setConstraints(totalHours, gbc);
          rp.add(totalHours, gbc);
  
          gbc.gridx = 11;
          gbc.gridy = 4;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          ratePerHour.setHorizontalAlignment(JLabel.CENTER);
          ratePerHour.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.BLACK));
          ratePerHour.setFont(ratePerHour.getFont().deriveFont(18.0f));
          gridbag.setConstraints(ratePerHour, gbc);
          rp.add(ratePerHour, gbc);
  
          gbc.gridx = 12;
          gbc.gridy = 4;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          totalAmount.setHorizontalAlignment(JLabel.CENTER);
          totalAmount.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
          totalAmount.setFont(totalAmount.getFont().deriveFont(18.0f));
          gridbag.setConstraints(totalAmount, gbc);
          rp.add(totalAmount, gbc);
  
          //row 5//////////////////////////////////////////////////////////////////
          gbc.gridx = 2;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          dayHeading.setHorizontalAlignment(JLabel.CENTER);
          dayHeading.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
          dayHeading.setFont(dayHeading.getFont().deriveFont(18.0f));
          gridbag.setConstraints(dayHeading, gbc);
          rp.add(dayHeading, gbc);
  
          gbc.gridx = 3;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          mon.setHorizontalAlignment(JLabel.CENTER);
          mon.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
          mon.setFont(mon.getFont().deriveFont(18.0f));
          gridbag.setConstraints(mon, gbc);
          rp.add(mon, gbc);
  
          gbc.gridx = 4;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          tues.setHorizontalAlignment(JLabel.CENTER);
          tues.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
          tues.setFont(tues.getFont().deriveFont(18.0f));
          gridbag.setConstraints(tues, gbc);
          rp.add(tues, gbc);
  
          gbc.gridx = 5;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          wed.setHorizontalAlignment(JLabel.CENTER);
          wed.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
          wed.setFont(wed.getFont().deriveFont(18.0f));
          gridbag.setConstraints(wed, gbc);
          rp.add(wed, gbc);
  
          gbc.gridx = 6;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          thur.setHorizontalAlignment(JLabel.CENTER);
          thur.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
          thur.setFont(thur.getFont().deriveFont(18.0f));
          gridbag.setConstraints(thur, gbc);
          rp.add(thur, gbc);
  
          gbc.gridx = 7;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          fri.setHorizontalAlignment(JLabel.CENTER);
          fri.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
          fri.setFont(fri.getFont().deriveFont(18.0f));
          gridbag.setConstraints(fri, gbc);
          rp.add(fri, gbc);
  
          gbc.gridx = 8;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          sat.setHorizontalAlignment(JLabel.CENTER);
          sat.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
          sat.setFont(sat.getFont().deriveFont(18.0f));
          gridbag.setConstraints(sat, gbc);
          rp.add(sat, gbc);
  
          gbc.gridx = 9;
          gbc.gridy = 5;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          sun.setHorizontalAlignment(JLabel.CENTER);
          sun.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
          sun.setFont(sun.getFont().deriveFont(18.0f));
          gridbag.setConstraints(sun, gbc);
          rp.add(sun, gbc);
  
          //row 6//////////////////////////////////////////////////////////////
          gbc.gridx = 2;
          gbc.gridy = 6;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          dateHeading.setHorizontalAlignment(JLabel.CENTER);
          dateHeading.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
          dateHeading.setFont(dateHeading.getFont().deriveFont(18.0f));
          gridbag.setConstraints(dateHeading, gbc);
          rp.add(dateHeading, gbc);   
  
          int dateSpaceIndex = 3;
          boolean flip = true;
          for (int k = 0; k &lt;= 6; k++)//create gridlines for day area
          {
              gbc.gridx = dateSpaceIndex;
              gbc.gridy = 6;
              gbc.gridheight = 1;
              gbc.gridwidth = 1;
              if(flip) dateSpace[k].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
              else dateSpace[k].setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
              gridbag.setConstraints(dateSpace[k], gbc);
              rp.add(dateSpace[k], gbc);
              dateSpaceIndex++;
              flip = !flip;
          }
  
          //row 7/////////////////////////////////////////////////////////////
          gbc.gridx = 1;
          gbc.gridy = 7;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          supt.setHorizontalAlignment(JLabel.CENTER);
          supt.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
          supt.setFont(supt.getFont().deriveFont(18.0f));
          gridbag.setConstraints(supt, gbc);
          rp.add(supt, gbc);
  
          //row 10///////////////////////////////////////////////////////////
          gbc.gridx = 1;
          gbc.gridy = 10;
          gbc.gridheight = 3;
          gbc.gridwidth = 1;
          foreman.setHorizontalAlignment(JLabel.CENTER);
          foreman.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
          foreman.setFont(foreman.getFont().deriveFont(18.0f));
          gridbag.setConstraints(foreman, gbc);
          rp.add(foreman, gbc);
  
          //row 13-36 plus 7-12 time worked labels//////////////////////////
          for (int r = 0; r &lt;= 7; r++)
          {
              gbc.gridx = 1;
              gbc.gridy = 13 + (3*r);
              gbc.gridheight = 3;
              gbc.gridwidth = 1;
              mechanic[r].setHorizontalAlignment(JLabel.CENTER);
              mechanic[r].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
              mechanic[r].setFont(mechanic[r].getFont().deriveFont(18.0f));
              gridbag.setConstraints(mechanic[r], gbc);
              rp.add(mechanic[r], gbc);
          }
  
          for (int c = 0; c &lt;= 9; c++){
              gbc.gridx = 2;
              gbc.gridy = 7 + (3*c);
              gbc.gridheight = 1;
              gbc.gridwidth = 1;
              ot2[c].setHorizontalAlignment(JLabel.CENTER);
              ot2[c].setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
              ot2[c].setFont(ot2[c].getFont().deriveFont(18.0f));
              gridbag.setConstraints(ot2[c], gbc);
              rp.add(ot2[c], gbc);
  
              gbc.gridx = 2;
              gbc.gridy = 8 + (3*c);
              gbc.gridheight = 1;
              gbc.gridwidth = 1;
              ot1[c].setHorizontalAlignment(JLabel.CENTER);
              ot1[c].setOpaque(true);
              ot1[c].setBackground(shade);
              ot1[c].setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
              ot1[c].setFont(ot1[c].getFont().deriveFont(18.0f));
              gridbag.setConstraints(ot1[c], gbc);
              rp.add(ot1[c], gbc);
  
              gbc.gridx = 2;
              gbc.gridy = 9 + (3*c);
              gbc.gridheight = 1;
              gbc.gridwidth = 1;
              st[c].setHorizontalAlignment(JLabel.CENTER);
              st[c].setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
              st[c].setFont(st[c].getFont().deriveFont(18.0f));
              gridbag.setConstraints(st[c], gbc);
              rp.add(st[c], gbc);
          }
          //row 37/////////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 37;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          locAndDescriptionLabel.setFont(locAndDescriptionLabel.getFont().deriveFont(18.0f));
          gridbag.setConstraints(locAndDescriptionLabel, gbc);
          rp.add(locAndDescriptionLabel);
  
          gbc.gridx = 11;
          gbc.gridy = 37;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          grandTotal.setHorizontalAlignment(JLabel.CENTER);
          grandTotal.setOpaque(true);
          grandTotal.setBackground(Color.BLACK);
          grandTotal.setForeground(Color.WHITE);
          grandTotal.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
          grandTotal.setFont(grandTotal.getFont().deriveFont(18.0f));
          gridbag.setConstraints(grandTotal, gbc);
          rp.add(grandTotal);
  
          gbc.gridx = 12;
          gbc.gridy = 37;
          gbc.gridwidth = 1;
          gbc.gridheight = 1;
          grandTotalSpace.setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
          gridbag.setConstraints(grandTotalSpace, gbc);
          rp.add(grandTotalSpace);
  
          //row 38////////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 38;
          gbc.gridwidth = 10;
          gbc.gridheight = 1;
          gbc.ipady = 80;
          locAndDescSpace.setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
          gridbag.setConstraints(locAndDescSpace, gbc);
          rp.add(locAndDescSpace);
  
          //row 39////////////////////////////////////////////////////////////////
          gbc.ipady = 0; //reset to default
          gbc.gridx = 0;
          gbc.gridy = 39;
          gbc.gridheight = 1;
          gbc.gridwidth = 2;
          toCertify.setFont(toCertify.getFont().deriveFont(18.0f));
          gridbag.setConstraints(toCertify, gbc);
          rp.add(toCertify);
  
          //row 40///////////////////////////////////////////////////////////////
          gbc.gridx = 0;
          gbc.gridy = 40;
          gbc.gridheight = 1;
          gbc.gridwidth = 3;
          authorizedBy.setFont(authorizedBy.getFont().deriveFont(18.0f));
          gridbag.setConstraints(authorizedBy, gbc);
          rp.add(authorizedBy);
  
  
          for (int r = 0; r &lt;= 9; r++)//gridlines for personnel space
          {
              gbc.gridx = 0;
              gbc.gridy = 7 + (3*r);
              gbc.gridheight = 3;
              gbc.gridwidth = 1;
              personnelSpace[r].setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
              gridbag.setConstraints(personnelSpace[r], gbc);
              rp.add(personnelSpace[r]);
          }
          //create calendar grid lines
          int yPointer = 7;
          int xPointer = 3;
          int shadePtr = 8;
          for (int j = 0; j &lt;= 299; j++)
          {
              gbc.gridx = xPointer;
              gbc.gridy = yPointer;
              gbc.gridheight = 1;
              gbc.gridwidth = 1;
              calendarGridLines[j].setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK));
              if (yPointer == shadePtr){ //if row number = shadePtr then color the cell
                  calendarGridLines[j].setOpaque(true);
                  calendarGridLines[j].setBackground(shade);
              }
              gridbag.setConstraints(calendarGridLines[j], gbc);
              rp.add(calendarGridLines[j]);
              xPointer++; //go to next cell in row
              j++; //use the next jlabel
              gbc.gridx = xPointer;
              gbc.gridy = yPointer;
              gbc.gridheight = 1;
              gbc.gridwidth = 1;
              calendarGridLines[j].setBorder(BorderFactory.createMatteBorder(0, 1, 1, 1, Color.BLACK));
              if (yPointer == shadePtr){ //if row number = shadePtr then color the cell
                  calendarGridLines[j].setOpaque(true);
                  calendarGridLines[j].setBackground(shade);
              }
              gridbag.setConstraints(calendarGridLines[j], gbc);
              rp.add(calendarGridLines[j]);
  
              xPointer++; //go to next cell in row
  
              if(xPointer == 13) //if end of column then go to next row and reset column pointer to 3 and increment shade pointer by 3
              {
                  yPointer++; //go down a row
                  xPointer = 3;
                  if((j % 3) == 0) {
                      shadePtr = yPointer;
                  }
              }
          }
  
          JButton printTest = new JButton("PrintTest");
          printTest.addActionListener(this);
          gbc.gridx = 0;
          gbc.gridy = 41;
          gbc.gridheight = 1;
          gbc.gridwidth = 1;
          gridbag.setConstraints(printTest, gbc);
          rp.add(printTest);
  
      }
      @Override
      public void actionPerformed(ActionEvent e) {
          PrinterJob printJob = PrinterJob.getPrinterJob();
          printJob.setPrintable(this);
          if (printJob.printDialog()){
              try{
                  printJob.print();
              }
              catch(Exception ex){
                  throw new RuntimeException(ex);
              }
          }
  
      }
      @Override
      public int print(Graphics g, PageFormat pf, int index)
              throws PrinterException {
          Graphics2D g2 = (Graphics2D)g;
          if (index &gt;= 1){
              return Printable.NO_SUCH_PAGE;
          }
          else {
              AffineTransform originalTransform = g2.getTransform();
  
              double scaleX = pf.getImageableWidth() / rp.getWidth();
              double scaleY = pf.getImageableHeight() / rp.getHeight();
              // Maintain aspect ratio
              double scale = Math.min(scaleX, scaleY);
              g2.translate(pf.getImageableX(), pf.getImageableY());
              g2.scale(scale, scale);
              rp.printAll(g2);
  
              g2.setTransform(originalTransform);
              return Printable.PAGE_EXISTS;
          }
      }
  
  }
  </code></pre>