我想在我的照片查看器中添加一个滚动条,但它给出了一个错误,即无法从静态上下文中引用非静态变量。
确切地说,我正在尝试将滚动条添加到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
答案 0 :(得分:1)
由于mainPanel
已包含scrollBar
,因此无需单独添加scrollBar
和mainPanel
。只需执行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());