I need to use a JScrollPane with absolute layoute. I know that the use of setLayout(null) is not recommendable at all. I've been reading that if you want to use the absolute layout with a JScrollPane it is necessary to set the preferred size property of the elements inside in order to JScrollPane can calculate its size.
I've been trying the next code changing the order and sizes of elemnts but I can't work out where I've been wrong.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class frame extends JFrame {
private JPanel contentPane;
private JScrollPane scrollPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame frame = new frame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public frame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(null);
setContentPane(contentPane);
JPanel panel = new JPanel();
panel.setBackground(Color.red);
panel.setBounds(0,0,600,600);
panel.setPreferredSize(new Dimension(420,280));
scrollPane = new JScrollPane(panel);
scrollPane.setBounds(0, 0, 600, 600);
scrollPane.setLayout(null);
scrollPane.setBackground(Color.green);
scrollPane.add(panel);
scrollPane.setPreferredSize(new Dimension(450,300));
contentPane.add(scrollPane);
}
}
Why setPreferredSize is not doing the right work? Thanks in advance.
Changing the layout manager of the actual
JScrollPane
does not make sense; if you wish to use absolute layout within your application you would typically callsetLayout(null)
on a container class (such asJPanel
) in order to position child components within it using absolute positioning.I suggest that you should try:
setLayout(null)
on theJPanel
contained within theJScrollPane
(as I think this is what you're trying to do).JPanel
directly, subclass it and have your subclass implement theScrollable
interface, which provides additional information to theJScrollPane
regarding the optimal scrollable viewport size.I can see your problem.
Here you set the bound and the preferred size of your panel.
then you set the bound of the scrollPane
Well, the bounds of the panel is useless, cause scrollPane cares only about the preferred size, and the preferred size of the panel is smaller then the bounds of the scrollPane, so the scrollPanel thinks he doesn't need to show anything else, that's why it doesn't show any scrollBars or enable them. OBS: I see no sense at setting the layout of the scrollPanel. So you can skip that line.
Just as commentary: Using scroll with absolut layout pane is just fine since you make the care of the preferred size of the pane.
First of all, don't change the layout manager of the scroll pane, it's not required for what you want to achieve
Second, scroll pane works though a
JViewport
. You have to add your container to it instead (scrollPane.add(panel)
is the wrong thing to do), instead usescrollPane.setViewportView(panel)
Thirdly, you want to take a look at the Scrollable interface as scroll pane doesn't just rely on the preferred size of its contents