Reputation: 21
I have a JPanel with multiple Object(custom class extends Jpanel) objects in it. The JPanel has a grid layout with 7 rows and 1 column. I'm trying to add a JPanel with 7 object in it to another JScrollPane so I can scroll to view all of the objects, but it's doing strange things. The scroll bar doesn't show up no matter how many objects are in the JPanel. Any ideas? Thanks in advance.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneLayout;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setLayout(new BorderLayout());
JLabel title = new JLabel("Game", JLabel.CENTER);
title.setPreferredSize(new Dimension(60,60));
title.setBorder(BorderFactory.createLineBorder(Color.black,5));
frame.add(title,BorderLayout.NORTH);
frame.setSize(850,480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Grid g = new Grid();
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1,3));
jp.add(g);
JPanel test = new JPanel();
test.setLayout(new GridLayout(7,1));
test.add(p1);
test.add(p2);
test.add(p3);
test.add(p4);
test.add(p5);
test.add(p6);
test.add(p7);
JScrollPane jsp = new JScrollPane(test);
jsp.setViewportView(test);
jsp.getVerticalScrollBar().setUnitIncrement(50);
jsp.setCorn
jsp.setVerticalScrollBarPolicy(22);
jp.add(jsp,BorderLayout.EAST);
frame.add(jp);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Upvotes: 1
Views: 4562
Reputation: 12696
Your code don't compile. Please look at the following code. It can scroll vertically and horizontally.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
class MyPanel extends JPanel {
MyPanel(Color c) {
setBackground(c);
}
}
public class Test {
public static void main(String[] args) {
JPanel panel = new JPanel();
// the size of this panel is larger than the frame
panel.setPreferredSize(new Dimension(500, 2000));
panel.setLayout(new GridLayout(7, 1));
// add 7 sub panels
panel.add(new MyPanel(Color.magenta));
panel.add(new MyPanel(Color.cyan));
panel.add(new MyPanel(Color.blue));
panel.add(new MyPanel(Color.green));
panel.add(new MyPanel(Color.yellow));
panel.add(new MyPanel(Color.orange));
panel.add(new MyPanel(Color.red));
JScrollPane scroll = new JScrollPane(panel);
scroll.setViewportView(panel);
scroll.getVerticalScrollBar().setUnitIncrement(50);
JFrame frame = new JFrame("Test");
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(scroll);
frame.setVisible(true);
}
}
Upvotes: 2
Reputation: 285415
The jp JPanel uses JPanel's default FlowLayout and this may prevent you from resizing your JScrollPane and seeing that it actually is working properly. Why not either add the JScrollPane to the JFrame's contentPane or make jp use a BorderLayout? Also you don't need to set the JScrollPane's viewportView as you're already doing this by passing "test" into its constructor.
Upvotes: 2