无法从静态上下文

时间:2017-01-03 18:09:08

标签: java static non-static

我编写了这段代码,它允许选择一个文件并获取文件名及其目录:

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

public class NewsReader
{
    static String filename = "";
    static String directory = "";
    public static void main (String... doNotMind)
    {
        open = new FileChooserTest
        FileChooserTest.run (new FileChooserTest(), 250, 110);
    }
}

class FileChooserTest extends JFrame 
{
    private JButton open = new JButton("Open");
    public FileChooserTest() 
    {
        JPanel p = new JPanel();
        open.addActionListener(new OpenL());
        p.add(open);
        Container cp = getContentPane();
        cp.add(p, BorderLayout.SOUTH);
        p = new JPanel();
        p.setLayout(new GridLayout(2, 1));
        cp.add(p, BorderLayout.NORTH);
    }

  class OpenL implements ActionListener 
  {
      public void actionPerformed(ActionEvent e) 
      {
          JFileChooser c = new JFileChooser();
          int rVal = c.showOpenDialog(FileChooserTest.this);
          if (rVal == JFileChooser.APPROVE_OPTION) 
          {
              NewsReader.filename = c.getSelectedFile().getName();
              NewsReader.directory = c.getCurrentDirectory().toString();
          }

          if (rVal == JFileChooser.CANCEL_OPTION) 
          {
              NewsReader.filename = "";
              NewsReader.directory = "";
          }
      }
    }

  public void run(JFrame frame, int w, int h) 
  {
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      setLocation(dim.width/2-getSize().width/2, dim.height/2-getSize().height/2);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(w, h);
      frame.setVisible(true);
    }
}

当我尝试编译它时,我得到了这个编译错误:

NewsReader.java:12: error: non-static method run(JFrame,int,int) cannot be referenced from a static context
    FileChooserTest.run (new FileChooserTest(), 250, 110);

当我编译其他程序时,经常出现此错误,您能解释一下它发生的原因以及解决方法吗?

1 个答案:

答案 0 :(得分:0)

FileChooserTest是该类的名称。您需要该类的实例才能使用其run方法。

幸运的是,你已经有了一个。您创建了该类型的变量open。所以你可以使用open.run(),它应该没问题。