scroll bars in swing

I am making a swing program in Java. I am instantiating a DemoFrame (inherited from JFrame) in my main class. In this DemoFrame class, I am instantiating a JScrollPane class. The JScrollPane adds a DemoPanel class (inherited off JPanel) which is where the drawing takes place. Then the DemoFrame adds the JScrollPane. I have the view policy set to always view for the scrollbars. The drawing that goes on in DemoPanel is way larger than the window which holds it. However, the problem is that the scroll bars appear but they aren't scrollable. i.e. the program doesnt think that the scrollbars are necessary but displays them because of the always policy. Here's my code:


import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.io.*;

class DemoFrame extends JFrame
{
  private DemoPanel panel;
  private int height, width;
  private Vector path;

  public DemoFrame(Hashtable h, int height, int width, Vector path)
  {
    super("window");
    final int DEFAULT_FRAME_WIDTH = 300;
    final int DEFAULT_FRAME_HEIGHT = 300;
    this.height = height;
    this.width = width;
    this.path = path;

    // set the size of the frame window
    setSize(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT);

    // create and install a "listener object"
    // (event handler) to listen for window events
    WindowCloser listener = new WindowCloser();
    addWindowListener(listener);

    // create a panel object and install it in
    // the "content pane"
    panel = new DemoPanel(h, height, width, path);

    JScrollPane js = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    js.setVisible(true);
    js.setOpaque(true);
    js.setWheelScrollingEnabled(true);

    Container contentPane = getContentPane();
    contentPane.add(js, "Center");

    this.setVisible(true);
  }
}

********************************************************

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.io.*;

class DemoPanel extends JPanel
{
  private Hashtable h;
  private int cellwidth = 10;
  private int cellheight = 10;
  private int height, width;
  private int ULx = 50, ULy = 50;
  private Vector path;

  public DemoPanel(Hashtable h, int height, int width, Vector path)
  {
    this.h = h;
    this.setVisible(true);
    this.setSize(900, 900);
    this.height = height;
    this.width = width;
    this.path = path;
  }

  public void paint(Graphics g)
  {
       //paint method
      //draws really really big picture
  }
}

What should I do?

lj8866



lj8866Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

TolsCommented:
Do not override 'paint' method, but 'paintComponent':

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    //draw code
}
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
timbauerCommented:
Tols is right about overriding paintComponent instead.

However, I think your problem might be in the preferred size of your component. Try calling,
setPreferredSize( new Dimension(900,900) );

I think a JScrollPane decides how much space to give your component based on getPreferredSize

getPreferredSize for any JComponent will fetch your saved dimension (900,900). Generally, if a paint delegate decides how much room is needed for getPreferredSize(). The delegate for JPanel computes this based on its layout and children. Since your Demo component has no children its preferred size is computed as (0,0).

Hope this helps.
- Tim
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Editors IDEs

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.