I am displaying an image in a scroll pane and it works great when the pane is smaller than the image. When the pane is larger then the image, the image is centered vertically and left justified horizontally. I would like the image to be left and top justified so all the extra space is on the bottom and right.
I have tried using insets, setAlignmentY(), the methods in JScrollPaneLayout and can't affect where the image is displaying.
All the tips and documents I have found show how to handle the panes when the scroll bars are needed, not when they are not.
I suspect the behavior is caused by the use of a JLabel to display the image, since JLabels seem to align themselves on the left and vertically centered by default. But none of my attempts have succeeded in shoving the image to the top.
Here is the actual code I used to create the above image (pared down significantly from my project, and comments removed for brevity). It should compile and run fine.
I am using Java 15 inside Intellij Idea community edition on a Windows 10 machine.
public class ShowPattern extends JFrame
{
public static final int IMAGE_WIDTH = 340;
public static final int IMAGE_HEIGHT = 272;
protected BufferedImage fullSizeImage;
private final JLabel imgLabel = new JLabel();
public ShowPattern(int width, int height)
{
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(createImagePane(this.imgLabel), BorderLayout.CENTER);
add(mainPanel);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setPreferredSize(new Dimension(width + 35, height + 60));
this.setLocation(25, 25);
pack();
}
public final void showMapImage(BufferedImage img, File file)
{
setTitle("Pattern from file " + file.getName());
fullSizeImage = img;
ImageIcon imgIcon = new ImageIcon(img);
imgLabel.setIcon(imgIcon);
}
private JScrollPane createImagePane(JLabel image)
{
JScrollPane scrollPane = new JScrollPane(image);
image.setAlignmentY(Component.TOP_ALIGNMENT); //DOESN'T AFFECT PLACEMENT
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
return scrollPane;
}
public static void main( String[] args )
{
ShowPattern showPattern = new ShowPattern(IMAGE_WIDTH, IMAGE_HEIGHT);
try
{
JFileChooser fileChooser = new JFileChooser();
int status = fileChooser.showOpenDialog(null);
fileChooser.setMultiSelectionEnabled(false);
if (status == JFileChooser.APPROVE_OPTION)
{
File file = fileChooser.getSelectedFile();
BufferedImage bimg;
try
{
bimg = ImageIO.read(file);
showPattern.showMapImage(bimg, file);
showPattern.setVisible(true);
}
catch (IOException ioe)
{
throw new RuntimeException(ioe);
}
}
}
catch (Exception e)
{
System.out.println("Exception Loading Pattern " + e.getMessage());
}
}
}
JLable#setHorizontalAlignment
andJLabel#setVerticalAlignment