Search code examples
javaswingjscrollpanejtextareanull-layout-manager

Why isn't my JScrollPane with a JTextArea visible when using null LayoutManager?


I'm trying to display a JTextArea within a JScrollPane, but I just get an empty frame when I run my (simplified) program:

import java.awt.Container;
import java.awt.Dimension;    
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ScrollPaneTest extends JFrame {
    private Container myCP; 
    private JTextArea resultsTA;
    private JScrollPane scrollPane;

    public ScrollPaneTest() {
        setSize(500, 500);
        setLocation(100, 100);
        myCP = this.getContentPane();
        myCP.setLayout(null);

        resultsTA = new JTextArea("Blah blah");
        scrollPane = new JScrollPane(resultsTA,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(200, 100));
        scrollPane.setLocation(100, 300);
        myCP.add(scrollPane);

        setVisible(true);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        new ScrollPaneTest();
    }
}

I use the null LayoutManager to be consistent with the textbook I'm teaching from.


Solution

  • This will work:

    public class ScrollPaneTest extends JFrame {
        private Container myCP; 
        private JTextArea resultsTA;
        private JScrollPane scrollPane;
    
        public ScrollPaneTest() {
            setSize(500, 500);
            setLocation(100, 100);
            myCP = this.getContentPane();
            myCP.setLayout(null);
    
            resultsTA = new JTextArea("Blah blah");
            resultsTA.setBounds(10, 10, 150, 30);
    
            scrollPane = new JScrollPane(resultsTA,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scrollPane.setPreferredSize(new Dimension(200, 100));
            scrollPane.setBounds(0, 0, 500, 500);
    
            myCP.add(scrollPane);
            setVisible(true);
            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
    
        public static void main(String[] args) {
            new ScrollPaneTest();
        }
    }
    

    If you are using null layout then you must specify bounds.


    Edit

    setBounds() method coveres the task of setLocation() method.

    for example, setBounds(x,y,w,h);

    first 2 will set the x/y location of that component with respect to its container. second 2(w/h) will set the size of that component.

    in other words:-

    1. setBounds(int x, int y, int witdh, int height) – Sets the component’s size and location
    2. setLocation(int x, int y) – Sets the component’s location