I am trying to create an image processing frame similar to the one found in Photoshop or Paint Shop Pro, and I am having problems.
Now I have a JFrame window with JDesktopPane. When I click the button, a JInternalFrame is created with the following components:
imageLabel = new JLabel("picture.png"); scrollPane.setViewPort(imageLabel); internalFrame.add(scrollPane);
My problem is this: I don't want JLabel or JScrollPane to stretch to the size of a JInternalFrame if the JLabel is smaller than the JInternalFrame.
I tried to fill the space around JLabel with "empty" JLabels. I tried switching the layout styles of JScrollPane. I tried setting the preferred and maximum sizes of JLabel and JScrollPane, as for picture.png. None of this works for what I need. I don’t want the empty “space” around the JLabel to be part of a JScrollPane or JLabel, so I can use different MouseEvents to trigger the image itself, and not the space left by the “stretched” JLabel or JScrollPane every time I resize the JInternalFrame.
Thanks in advance.
Edit1: Here is some code that emphasizes the problem.
import java.awt.*; import java.awt.event.*; class fooFrame extends JFrame implements MouseListener { private static fooFrame frame; JLabel fooLabel; public fooFrame() { JDesktopPane background = new JDesktopPane(); JInternalFrame internalFrame = new JInternalFrame("Internal Frame", true, true, true, true); internalFrame.setSize(500, 500); internalFrame.setLocation(20, 20); internalFrame.setVisible(true); Image image = Toolkit.getDefaultToolkit().getImage("test.gif"); fooLabel = new JLabel(new ImageIcon("test.gif")); fooLabel.setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null))); JScrollPane fooScrollPane = new JScrollPane(fooLabel, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); fooScrollPane.setPreferredSize(new Dimension(fooLabel.getWidth(), fooLabel.getHeight())); fooScrollPane.setViewportView(fooLabel);
You will need to get your own "test.gif", and if you make the inner frame larger than the picture, it will fill the remaining space with a label. Because all mouseEvents fire when I cross the inner frame, not the image, as if I want this to happen.
Edit2: Code changed with Kleopatra suggestions.
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.LineBorder; public class a1 { public static void main(String[] args) { fooFrame.createAndShowGUI(); } } class fooFrame extends JFrame implements MouseListener { private static fooFrame frame; JLabel fooLabel; public fooFrame() { JDesktopPane background = new JDesktopPane(); JInternalFrame internalFrame = new JInternalFrame("Internal Frame", true, true, true, true); internalFrame.setLocation(20, 20); internalFrame.setVisible(true); internalFrame.pack(); Image image = Toolkit.getDefaultToolkit().getImage("test.gif"); fooLabel = new JLabel(new ImageIcon(image)); fooLabel.setBorder(new LineBorder(Color.PINK)); JScrollPane fooScrollPane = new JScrollPane((fooLabel), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); internalFrame.setLayout(new BoxLayout(internalFrame.getContentPane(), BoxLayout.LINE_AXIS)); fooScrollPane.setViewportView(fooLabel);