'非静态变量不能......'错误

时间:2013-03-24 21:50:46

标签: java swing

我想在我的照片查看器中添加一个滚动条,但它给出了一个错误,即无法从静态上下文中引用非静态变量。

确切地说,我正在尝试将滚动条添加到JPanel。另外,如果我使JScrollPane scrollBar成为一个静态变量,那么照片就不会出现了。 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

2 个答案:

答案 0 :(得分:1)

由于mainPanel已包含scrollBar,因此无需单独添加scrollBarmainPanel。只需执行mainFrame.add(imageList.getScrollBar());,就不要再调用mainFrame.add(imageList.getPanel());。单个控件只能添加到一个容器中。

JFrame的默认布局为BorderLayout。在不指定布局约束的情况下向BorderLayout添加控件时,它会将控件放在BorderLayout.CENTER中,从而有效地替换之前的控件。

答案 1 :(得分:0)

只是对您的代码稍作修改:)

而不是

scrollBar = new JScrollPane(mainPanel); 

使用

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

并且不需要

mainFrame.add(imageList.getScrollBar());