BadZen
BadZen

Reputation: 4274

JScrollPane drawing components under itself

I have a JScrollPane inside of a JTabbedPane tab. Into that JScrollPane I place a JPanel whose background is red and whose size is explicitly set.

This is what I get:

enter image description here

enter image description here

Note that in the second image, where the container frame has been resized, the component is being drawn under the scrollbar elements.

What's going on here? I've tried just about every combination of layout managers for all the components involved (as well as components besides JPanel - ultimately I want several JEditorPane here), and I cannot get anything to draw except under a big, blank, rectangle (is it a background? which?)

Code:

In main JFrame subclass:

// Called once on startup/layout.
public void refreshGUIState() {
    for (int i = 0; i < client.getFrameStackLength(); i++) {
        InferenceFrame frame = client.getFrame(i);
        JScrollPane pane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                           JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        JPanel wtf = new JPanel();
        pane.setBackground(Color.YELLOW);
        wtf.setBackground(Color.red);
        wtf.setSize(100,100);
        wtf.setPreferredSize(wtf.getSize());
        pane.add(wtf);
        workspace.addTab(Integer.toString(i), pane);
    }
}

public GuiClient() throws CliException, ParticleSourceException {
    super("L4 Interactive Prover");
    setSize(800,600);

    mainArea = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
    mainArea.setDividerSize(2);
    mainArea.setBackground(Color.DARK_GRAY);
    getContentPane().add(mainArea);

    /* ... menu bar init ... */

    toolspace = new JPanel();
    workspace = new JTabbedPane();
    mainArea.add(toolspace);
    mainArea.add(workspace);

    this.validate();
    refreshGUIState();
}

Edit: under the suspicion that JScrollPane was somehow not creating a viewport when its first child was added, as expected, I also tried the three-argument constructor. Same behavior.

Re-edit: Except I erred and left in the add() call. Whoops. Looks like that's it.

Upvotes: 0

Views: 69

Answers (1)

John Doe
John Doe

Reputation: 125

Instead of

pane.add(wtf);

you need

pane.setViewportView(wtf);

You can also do it when initialising the JScrollPane:

JScrollPane pane = new JScrollPane(wtf);

Or, in your case:

JScollPane pane = new JScrollPane(wtf, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

Upvotes: 4

Related Questions