0

I wanted to add a scrollbar to my photo viewer but the it gives me the error that a non static variable cannot be referenced from a static context.

To be exact, I'm trying to add a scrollbar to a JPanel. Also, if I make JScrollPane scrollBar a static variable, then the photo wont appear. TIA

import java.awt.Container;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.DefaultListModel;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.JScrollPane;


public class PhotoViewer 
{
// Instance fields.
private FilenameFilter fileNameFilter;
private JFileChooser fileChooser;
private JMenuBar menuBar;
private JPanel mainPanel;
private static JScrollPane scrollBar;

public PhotoViewer() // Constructor.
{ 
    // Main JPanel with a grid style layout.
    mainPanel = new JPanel(new GridLayout());

    // Jlabel to display photo on.
    final JLabel imageView = new JLabel();
    // Adds the JLabel ontop of the JPanel.
    mainPanel.add(imageView);

    // Adds a scroll bar. 
    scrollBar = new JScrollPane(mainPanel);       
    scrollBar.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);    

    // Creates a file chooser to find a photo.
    fileChooser = new JFileChooser();

    // Creates a new menubar at the top of the JPanel.
    menuBar = new JMenuBar();
    // Adds a menu within the JMenuBar.
    JMenu menu = new JMenu("View new photo");
    // Adds the additional menu ontop of the original JMenuBar.
    menuBar.add(menu);
    // Option to browse for a new photo. 
    JMenuItem browse = new JMenuItem("Browse");
    // Adds the browse option ontop of the 'View new photo' button. 
    menu.add(browse);

    // Creates an actionlistener to follow what the user is doing.
    browse.addActionListener(new ActionListener()
        {

            public void actionPerformed(ActionEvent ae) 
            {
                int result = fileChooser.showOpenDialog(mainPanel);
                // Displays the image if approved by JFileChooser.
                if (result==JFileChooser.APPROVE_OPTION) 
                {
                    // Obtains the selected file by the user.
                    File singleImage = fileChooser.getSelectedFile();
                    try 
                    {   
                        // Displays the image if no exception.
                        Image displayImage = ImageIO.read(singleImage);
                        imageView.setIcon(new ImageIcon(displayImage));
                    } catch(Exception e)                        
                    {
                        // Displays the exception caught by the program in a JOptionPane window.
                        e.printStackTrace();
                        JOptionPane.showMessageDialog(mainPanel, e, "Load failure!",   JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        }); 

} // end of constructor PhotoViewer

public void loadImages(File directory) throws IOException 
{   
    // Throws an exception to be caught. 
    File[] imageFiles = directory.listFiles(fileNameFilter);
    BufferedImage[] images = new BufferedImage[imageFiles.length];
} // end of method loadImages(File directory)

public Container getPanel() 
{
    // Hands execution back to the mainPanel function.
    return mainPanel;
}// end of method getPanel()

public JMenuBar getMenuBar() 
{
    // Hands execution back to the menuBar function.
    return menuBar;
}// end of method getMenuBar()

public JScrollPane getScrollBar() 
{
    // Hands execution back to the menuBar function.
    return scrollBar;
}// end of method getScrollBar()

public static void main(String[] args) 
{
    SwingUtilities.invokeLater(new Runnable()
        {
            public void run() 
            {
                // Input all the compoenents of the photo viewer to the JFrame to       display them.
                PhotoViewer imageList = new PhotoViewer();

                // Creates a new JFrame to display everything.
                JFrame mainFrame = new JFrame("Photo Viewer");
                // 'Throws away' the JFrame on close. 
                mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // Adds all the different components to the JFrame.
                mainFrame.add(imageList.getPanel());
                mainFrame.add(imageList.getScrollBar());
                mainFrame.setJMenuBar(imageList.getMenuBar());
                mainFrame.setLocationByPlatform(true);
                // Packs all the components into the JFrame. 
                mainFrame.pack();
                // Sets the size of the JFrame.
                mainFrame.setSize(1500,1500);
                // Allows us to see the JFrame.
                mainFrame.setVisible(true);
            }
        });
} // end of method main(String[] args)
} // end of class PhotoViewer
15
  • Please include the stack trace Commented Mar 24, 2013 at 21:52
  • @AliAlamiri: There are no stacktraces for compiler errors... Commented Mar 24, 2013 at 21:55
  • 3
    @jlordo but this code complies just fine. Commented Mar 24, 2013 at 21:57
  • How would I find the stack trace? Sorry I'm a noob at Java. Commented Mar 24, 2013 at 21:58
  • @jlordo What dantuch said Commented Mar 24, 2013 at 21:58

2 Answers 2

1

There is no need to add mainPanel and scrollBar separately, as scrollBar already contains mainPanel. Just execute mainFrame.add(imageList.getScrollBar()); and don't call mainFrame.add(imageList.getPanel()); at all. A single control can be added only to one container.

Default layout of JFrame is BorderLayout. When you add controls to BorderLayout without specifying layout constraint it places the control in BorderLayout.CENTER, effectively replacing whatever there was before.

Sign up to request clarification or add additional context in comments.

Comments

0

Just a minor change to your code :)

instead of

scrollBar = new JScrollPane(mainPanel); 

use

scrollBar = new JScrollPane(imageView);
mainPanel.add(scrollBar);

and there is no need for

mainFrame.add(imageList.getScrollBar());

1 Comment

btw there is no need to set scrollBar static :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.