diff --git a/src/java.desktop/share/classes/javax/swing/JViewport.java b/src/java.desktop/share/classes/javax/swing/JViewport.java index 7ceab7f83dd..f7c27314750 100644 --- a/src/java.desktop/share/classes/javax/swing/JViewport.java +++ b/src/java.desktop/share/classes/javax/swing/JViewport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -603,15 +603,11 @@ public class JViewport extends JComponent implements Accessible private Graphics getBackingStoreGraphics(Graphics g) { - if (!SwingUtilities2.isPrinting(g)) { - Graphics bsg = backingStoreImage.getGraphics(); - bsg.setColor(g.getColor()); - bsg.setFont(g.getFont()); - bsg.setClip(g.getClipBounds()); - return bsg; - } else { - return g; - } + Graphics bsg = backingStoreImage.getGraphics(); + bsg.setColor(g.getColor()); + bsg.setFont(g.getFont()); + bsg.setClip(g.getClipBounds()); + return bsg; } diff --git a/src/java.desktop/share/classes/sun/print/PathGraphics.java b/src/java.desktop/share/classes/sun/print/PathGraphics.java index e7fc04a97c4..7a82ffb4a48 100644 --- a/src/java.desktop/share/classes/sun/print/PathGraphics.java +++ b/src/java.desktop/share/classes/sun/print/PathGraphics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,6 +64,7 @@ import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; import java.awt.image.ImageObserver; import java.awt.image.IndexColorModel; +import java.awt.image.MultiResolutionImage; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; @@ -1132,6 +1133,9 @@ public abstract class PathGraphics extends ProxyGraphics2D { // VI needs to make a new BI: this is unavoidable but // I don't expect VI's to be "huge" in any case. return ((VolatileImage)img).getSnapshot(); + } else if (img instanceof MultiResolutionImage) { + return convertToBufferedImage((MultiResolutionImage) img, + img.getWidth(null), img.getHeight(null)); } else { // may be null or may be some non-standard Image which // shouldn't happen as Image is implemented by the platform @@ -1142,6 +1146,18 @@ public abstract class PathGraphics extends ProxyGraphics2D { } } + protected BufferedImage convertToBufferedImage(MultiResolutionImage multiResolutionImage, + double width, double height ) { + Image resolutionImage = multiResolutionImage.getResolutionVariant(width, height); + BufferedImage bufferedImage = new BufferedImage(resolutionImage.getWidth(null), + resolutionImage.getHeight(null), + BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = bufferedImage.createGraphics(); + g2d.drawImage(resolutionImage, 0, 0, (int) width, (int) height, null); + g2d.dispose(); + return bufferedImage; + } + /** * Return true if the BufferedImage argument has non-opaque * bits in it and therefore can not be directly rendered by diff --git a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java index d85d10963ed..d763a72d528 100644 --- a/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java +++ b/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1317,7 +1317,7 @@ public class SwingUtilities2 { * returns true if the Graphics is print Graphics * false otherwise */ - public static boolean isPrinting(Graphics g) { + static boolean isPrinting(Graphics g) { return (g instanceof PrinterGraphics || g instanceof PrintGraphics); } diff --git a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java index 6a12a361345..5621b359346 100644 --- a/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java +++ b/test/jdk/javax/swing/JTable/JTableScrollPrintTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,13 +36,12 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JViewport; -import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; /* * @test * @key headful - * @bug 8210807 + * @bug 8210807 8322140 * @library /java/awt/regtesthelpers * @build PassFailJFrame * @summary Test to check if JTable can be printed when JScrollPane added to it. @@ -50,32 +49,27 @@ import javax.swing.table.DefaultTableModel; */ public class JTableScrollPrintTest { - public static JFrame frame; - public static PassFailJFrame passFailJFrame; - public static void main(String[] args) throws Exception { - SwingUtilities.invokeAndWait(() -> { - try { - initialize(); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); - passFailJFrame.awaitAndCheck(); - } - - public static void initialize() throws Exception { - final String INSTRUCTIONS = """ + String INSTRUCTIONS = """ Instructions to Test: 1. Print table onto Paper/PDF, using the Print Dialog. 2. If entire table is printed, then the Test is PASS. 3. If table is partially printed without table cells, then the Test is FAIL. """; - TestTable testTable = new TestTable(true); - frame = new JFrame("JTable Print Test"); - passFailJFrame = new PassFailJFrame("Test Instructions", INSTRUCTIONS, 5L, 6, 35); + PassFailJFrame.builder() + .title("Test Instructions") + .instructions(INSTRUCTIONS) + .rows(6) + .columns(35) + .testUI(JTableScrollPrintTest::initialize) + .build() + .awaitAndCheck(); + } + public static JFrame initialize() { + TestTable testTable = new TestTable(true); + JFrame frame = new JFrame("JTable Print Test"); PassFailJFrame.addTestWindow(frame); PassFailJFrame.positionTestWindow(frame, PassFailJFrame.Position.VERTICAL); frame.add(testTable); @@ -83,6 +77,7 @@ public class JTableScrollPrintTest { frame.setVisible(true); PrintUtilities printerJob = new PrintUtilities(testTable); printerJob.print("Test BackingStore Image Print"); + return frame; } public static class TestTable extends JPanel { @@ -103,7 +98,7 @@ public class JTableScrollPrintTest { JTable table = new JTable(model); - if (useScrollPane == true) { + if (useScrollPane) { JScrollPane sp = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); @@ -117,7 +112,7 @@ public class JTableScrollPrintTest { } static class PrintUtilities implements Printable { - private Component componentToBePrinted; + private final Component componentToBePrinted; public void printComponent(Component c, String jobname) { new PrintUtilities(c).print(jobname);