gpt4 book ai didi

java - “非静态变量不能...”错误

转载 作者:行者123 更新时间:2023-12-01 14:44:18 25 4
gpt4 key购买 nike

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

准确地说,我正在尝试向 JPanel 添加滚动条。另外,如果我将 JScrollPane 滚动条设置为静态变量,那么照片将不会出现。 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

最佳答案

无需单独添加mainPanelscrollBar,因为scrollBar已经包含mainPanel。只需执行 mainFrame.add(imageList.getScrollBar()); 并且根本不调用 mainFrame.add(imageList.getPanel()); 。单个控件只能添加到一个容器中。

JFrame 的默认布局是 BorderLayout。当您将控件添加到 BorderLayout 而不指定布局约束时,它会将控件放置在 BorderLayout.CENTER 中,从而有效地替换之前的内容。

关于java - “非静态变量不能...”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com