Quinck
Quinck

Reputation: 13

JScrollPane not working as intended, why?

Edit the action listener by adding 6 more branches to the else-if logic. Each branch will compare the actionCommand to the 6 submenu items: Metal, Motif, Window, Never, Always, and As Needed.

a. Each Look and Feel submenu item will use a try-catch statement to set the look and feel to the appropriate one, displaying an error message if this was not accomplished.

b. Each Scroll Bars submenu item will set the horizontal and vertical scroll bar policy to the appropriate values.

c. Any components that have already been created need to be updated. This can be accomplished by calling the SwingUtilities.updateComponentTreeUI method, passing a reference to the component that you want to update as an argument. Specifically you will need to add the line

SwingUtilities.updateComponentTreeUIgetContentPane());

to each branch that you just added to the logic structure.

My code is this..and it is crashing and I am completely stuck on why. Any help is appreciated.

package src.javaapplication5;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class NoteTaker extends JFrame {
    //constants for set up of note taking area

    public static final int WIDTH = 600;
    public static final int HEIGHT = 300;
    public static final int LINES = 13;
    public static final int CHAR_PER_LINE = 45;

    //objects in GUI
    private JTextArea theText;      //area to take notes
    private JMenuBar mBar;  //horizontal menu bar
    private JPanel textPanel;   //panel to hold scrolling text area 
    private JMenu notesMenu;    //vertical menu with choices for notes

    //****THESE ITEMS ARE NOT YET USED.  YOU WILL BE CREATING THEM IN THIS LAB
    private JMenu viewMenu; //vertical menu with choices for views  
    private JMenu lafMenu;  //vertical menu with look and feel
    private JMenu sbMenu;   //vertical menu with scroll bar option
    private JScrollPane scrolledText;   //scroll bars   

    //default notes
    private String note1 = "No Note 1.";
    private String note2 = "No Note 2.";

    /**
     * constructor
     */
    public NoteTaker() {
        //create a closeable JFrame with a specific size
        super("Note Taker");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //get contentPane and set layout of the window
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        //creates the vertical menus 
        createNotes();
        createViews();

        //creates horizontal menu bar and 
        //adds vertical menus to it
        mBar = new JMenuBar();
        mBar.add(notesMenu);
        mBar.add(viewMenu);
        //****ADD THE viewMenu TO THE MENU BAR HERE
        setJMenuBar(mBar);

        //creates a panel to take notes on
        textPanel = new JPanel();
        textPanel.setBackground(Color.blue);
        JTextArea theText = new JTextArea(LINES, CHAR_PER_LINE);
        theText.setBackground(Color.white);

        JScrollPane scrolledText = new JScrollPane(theText);

        //****CREATE A JScrollPane OBJECT HERE CALLED scrolledText
        //****AND PASS IN theText, THEN 
        //****CHANGE THE LINE BELOW BY PASSING IN scrolledText
        textPanel.add(scrolledText);

        contentPane.add(textPanel, BorderLayout.CENTER);
    }

    /**
     * creates vertical menu associated with Notes menu item on menu bar
     */
    public void createNotes() {
        notesMenu = new JMenu("Notes");
        JMenuItem item;

        item = new JMenuItem("Save Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Save Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Clear");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Exit");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);
    }

    /**
     * creates vertical menu associated with Views menu item on the menu bar
     */
    public void createViews() {

        viewMenu = new JMenu("Views");
        viewMenu.setMnemonic(KeyEvent.VK_V);

        createLookAndFeel();
        createScrollBars();

        lafMenu.addActionListener(new MenuListener());
        sbMenu.addActionListener(new MenuListener());

        viewMenu.add(lafMenu);
        viewMenu.add(sbMenu);

    }

    /**
     * creates the look and feel submenu
     */
    public void createLookAndFeel() {

        lafMenu = new JMenu("Look and Feel");
        lafMenu.setMnemonic(KeyEvent.VK_L);

        JMenuItem metalItem;
        JMenuItem motifItem;
        JMenuItem windowsItem;

        metalItem = new JMenuItem("Metal");
        metalItem.addActionListener(new MenuListener());

        motifItem = new JMenuItem("Motif");
        motifItem.addActionListener(new MenuListener());

        windowsItem = new JMenuItem("Windows");
        windowsItem.addActionListener(new MenuListener());

        lafMenu.add(metalItem);
        lafMenu.add(motifItem);
        lafMenu.add(windowsItem);

    }

    /**
     * creates the scroll bars submenu
     */
    public void createScrollBars() {

        sbMenu = new JMenu("Scroll Bars");
        sbMenu.setMnemonic(KeyEvent.VK_S);

        JMenuItem neverItem;
        JMenuItem alwaysItem;
        JMenuItem asneededItem;

        neverItem = new JMenuItem("Never");
        neverItem.addActionListener(new MenuListener());

        alwaysItem = new JMenuItem("Always");
        alwaysItem.addActionListener(new MenuListener());

        asneededItem = new JMenuItem("As Needed");
        asneededItem.addActionListener(new MenuListener());

        sbMenu.add(neverItem);
        sbMenu.add(alwaysItem);
        sbMenu.add(asneededItem);

    }

    private class MenuListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String actionCommand = e.getActionCommand();
            if (actionCommand.equals("Save Note 1")) {
                note1 = theText.getText();
            } else if (actionCommand.equals("Save Note 2")) {
                note2 = theText.getText();
            } else if (actionCommand.equals("Clear")) {
                theText.setText("");
            } else if (actionCommand.equals("Open Note 1")) {
                theText.setText(note1);
            } else if (actionCommand.equals("Open Note 2")) {
                theText.setText(note2);
            } else if (actionCommand.equals("Exit")) {
                System.exit(0);
            } else if (actionCommand.equals("Metal")) {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(getContentPane());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }
            } else if (actionCommand.equals("Motif")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(getContentPane());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Windows")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(getContentPane());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Never")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } else if (actionCommand.equals("Always")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } else if (actionCommand.equals("As Needed")) {
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                SwingUtilities.updateComponentTreeUI(getContentPane());
            } //****ADD 6 BRANCHES TO THE ELSE-IF STRUCTURE
            //****TO ALLOW ACTION TO BE PERFORMED FOR EACH
            //****MENU ITEM YOU HAVE CREATED
            else {
                theText.setText("Error in memo interface");
            }
        }
    }

    public static void main(String[] args) {
        NoteTaker gui = new NoteTaker();
        gui.setVisible(true);
    }
}

Upvotes: 1

Views: 544

Answers (3)

Styne12
Styne12

Reputation: 11

Your code:

else if (actionCommand.equals("Never")) {
scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            SwingUtilities.updateComponentTreeUI(getContentPane());
            scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
            SwingUtilities.updateComponentTreeUI(getContentPane());
        } else if (actionCommand.equals("Always")) {
            scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            SwingUtilities.updateComponentTreeUI(getContentPane());
            scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            SwingUtilities.updateComponentTreeUI(getContentPane());
        } else if (actionCommand.equals("As Needed")) {
            scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            SwingUtilities.updateComponentTreeUI(getContentPane());
            scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            SwingUtilities.updateComponentTreeUI(getContentPane());
        }

My code :

else if (actionCommand.equals("Never")) {
            scrolledText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            SwingUtilities.updateComponentTreeUI(getContentPane());
            scrolledText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
            SwingUtilities.updateComponentTreeUI(getContentPane());
        } 
        else if (actionCommand.equals("Always")) {
            scrolledText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            SwingUtilities.updateComponentTreeUI(getContentPane());
            scrolledText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            SwingUtilities.updateComponentTreeUI(getContentPane());
        } 
        else if (actionCommand.equals("As Needed")) {
            scrolledText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            SwingUtilities.updateComponentTreeUI(getContentPane());
            scrolledText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
            SwingUtilities.updateComponentTreeUI(getContentPane());
        }

Upvotes: 1

mKorbel
mKorbel

Reputation: 109815

lots of issues, please to compare your code with

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.EmptyBorder;

public class NoteTaker {
    //constants for set up of note taking area

    public static final int WIDTH = 600;
    public static final int HEIGHT = 300;
    public static final int LINES = 13;
    public static final int CHAR_PER_LINE = 45;
    //
    private JFrame frame = new JFrame("Note Taker");

    //objects in GUI
    private JTextArea theText;      //area to take notes
    private JMenuBar mBar;  //horizontal menu bar
    private JPanel textPanel;   //panel to hold scrolling text area 
    private JMenu notesMenu;    //vertical menu with choices for notes

    //****THESE ITEMS ARE NOT YET USED.  YOU WILL BE CREATING THEM IN THIS LAB
    private JMenu viewMenu; //vertical menu with choices for views  
    private JMenu lafMenu;  //vertical menu with look and feel
    private JMenu sbMenu;   //vertical menu with scroll bar option
    private JScrollPane scrolledText;   //scroll bars   

    //default notes
    private String note1 = "No Note 1.";
    private String note2 = "No Note 2.";

    /**
     * constructor
     */
    public NoteTaker() {
        //create a closeable JFrame with a specific size
        //setSize(WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //get contentPane and set layout of the window
        //Container contentPane = frame;
        //contentPane.setLayout(new BorderLayout());
        //creates the vertical menus 
        createNotes();
        createViews();

        //creates horizontal menu bar and 
        //adds vertical menus to it
        mBar = new JMenuBar();
        mBar.add(notesMenu);
        mBar.add(viewMenu);
        //****ADD THE viewMenu TO THE MENU BAR HERE
        frame.setJMenuBar(mBar);

        //creates a panel to take notes on
        textPanel = new JPanel(new BorderLayout());
        textPanel.setBackground(Color.blue);
        textPanel.setBorder(new EmptyBorder(5,5,5,5));
        /*JTextArea*/ theText = new JTextArea(LINES, CHAR_PER_LINE);
        theText.setBackground(Color.white);

        /*JScrollPane*/ scrolledText = new JScrollPane(theText);

        //****CREATE A JScrollPane OBJECT HERE CALLED scrolledText
        //****AND PASS IN theText, THEN 
        //****CHANGE THE LINE BELOW BY PASSING IN scrolledText
        textPanel.add(scrolledText);

        frame.add(textPanel/*, BorderLayout.CENTER*/);
        frame.pack();
        frame.setVisible(true);
    }

    /**
     * creates vertical menu associated with Notes menu item on menu bar
     */
    public void createNotes() {
        notesMenu = new JMenu("Notes");
        JMenuItem item;

        item = new JMenuItem("Save Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Save Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 1");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Open Note 2");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Clear");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);

        item = new JMenuItem("Exit");
        item.addActionListener(new MenuListener());
        notesMenu.add(item);
    }

    /**
     * creates vertical menu associated with Views menu item on the menu bar
     */
    public void createViews() {

        viewMenu = new JMenu("Views");
        viewMenu.setMnemonic(KeyEvent.VK_V);

        createLookAndFeel();
        createScrollBars();

        lafMenu.addActionListener(new MenuListener());
        sbMenu.addActionListener(new MenuListener());

        viewMenu.add(lafMenu);
        viewMenu.add(sbMenu);

    }

    /**
     * creates the look and feel submenu
     */
    public void createLookAndFeel() {

        lafMenu = new JMenu("Look and Feel");
        lafMenu.setMnemonic(KeyEvent.VK_L);

        JMenuItem metalItem;
        JMenuItem motifItem;
        JMenuItem windowsItem;

        metalItem = new JMenuItem("Metal");
        metalItem.addActionListener(new MenuListener());

        motifItem = new JMenuItem("Motif");
        motifItem.addActionListener(new MenuListener());

        windowsItem = new JMenuItem("Windows");
        windowsItem.addActionListener(new MenuListener());

        lafMenu.add(metalItem);
        lafMenu.add(motifItem);
        lafMenu.add(windowsItem);

    }

    /**
     * creates the scroll bars submenu
     */
    public void createScrollBars() {

        sbMenu = new JMenu("Scroll Bars");
        sbMenu.setMnemonic(KeyEvent.VK_S);

        JMenuItem neverItem;
        JMenuItem alwaysItem;
        JMenuItem asneededItem;

        neverItem = new JMenuItem("Never");
        neverItem.addActionListener(new MenuListener());

        alwaysItem = new JMenuItem("Always");
        alwaysItem.addActionListener(new MenuListener());

        asneededItem = new JMenuItem("As Needed");
        asneededItem.addActionListener(new MenuListener());

        sbMenu.add(neverItem);
        sbMenu.add(alwaysItem);
        sbMenu.add(asneededItem);

    }

    private class MenuListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String actionCommand = e.getActionCommand();
            if (actionCommand.equals("Save Note 1")) {
                note1 = theText.getText();
            } else if (actionCommand.equals("Save Note 2")) {
                note2 = theText.getText();
            } else if (actionCommand.equals("Clear")) {
                theText.setText("");
            } else if (actionCommand.equals("Open Note 1")) {
                theText.setText(note1);
            } else if (actionCommand.equals("Open Note 2")) {
                theText.setText(note2);
            } else if (actionCommand.equals("Exit")) {
                System.exit(0);
            } else if (actionCommand.equals("Metal")) {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }
            } else if (actionCommand.equals("Motif")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Windows")) {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null, "Error setting "
                            + "the look and feel");
                    System.exit(0);
                }

            } else if (actionCommand.equals("Never")) {
                //SwingUtilities.updateComponentTreeUI(frame);
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                //SwingUtilities.updateComponentTreeUI(frame);
            } else if (actionCommand.equals("Always")) {
                //SwingUtilities.updateComponentTreeUI(frame);
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                //SwingUtilities.updateComponentTreeUI(frame);
            } else if (actionCommand.equals("As Needed")) {
                //SwingUtilities.updateComponentTreeUI(frame);
                scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                //SwingUtilities.updateComponentTreeUI(frame);
            } //****ADD 6 BRANCHES TO THE ELSE-IF STRUCTURE
            //****TO ALLOW ACTION TO BE PERFORMED FOR EACH
            //****MENU ITEM YOU HAVE CREATED
            else {
                theText.setText("Error in memo interface");
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                NoteTaker gui = new NoteTaker();
            }
        });
    }
}

Upvotes: 2

mattiash
mattiash

Reputation: 172

You are getting an exception because scrollText is null.

When creating scrollText, it is created as a local variable in the constructor.

JScrollPane scrolledText = new JScrollPane(theText);

It is also declared as a field, but since it is also declared as a local variable in the constructor, the field is never initialized.

Instead, just do:

scrolledText = new JScrollPane(theText);

Upvotes: 1

Related Questions