JFileChooser崩溃 - Java 7

时间:2015-01-09 23:18:47

标签: java jbutton actionlistener jfilechooser

我正在尝试使用JFileChooser使我的程序加载一个txt文件,但它似乎不起作用。当我按下JButton时,控制台给了我很多错误。到目前为止,这是完整的代码:

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

public class Sudoku extends JFrame{
    JPanel mainWindow = new JPanel();
    JPanel buttonWindow = new JPanel();
    JPanel sudokuArea = new JPanel();
    JButton load = new JButton("Load");
    JButton solve = new JButton("Solve");
    JTextArea sudokuGrid = new JTextArea();
    Field field = new Field();

  public static void main(String[] args) {

    new Sudoku();
  }

  public Sudoku(){
      super("SudokuSolver");
      setSize(200,300);
      setResizable(false);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      add(mainWindow);

      mainWindow.setLayout(new BorderLayout());
      mainWindow.add(buttonWindow, BorderLayout.SOUTH);
      mainWindow.add(sudokuArea, BorderLayout.CENTER);

      buttonWindow.add(load);
      buttonWindow.add(solve);

      sudokuArea.setLayout(new BorderLayout());
      sudokuArea.add(sudokuGrid, BorderLayout.CENTER);

      sudokuGrid.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
      sudokuGrid.setEditable(false);
      sudokuGrid.append(field.toString());

      load.addActionListener(new ActionListener() { 
          public void actionPerformed(ActionEvent e) { 
                loader();
              }
            public void loader(){
                JFileChooser sumtin = new JFileChooser();
                if(sumtin.showOpenDialog() == JFileChooser.APPROVE_OPTION)
                {
                        File filer = sumtin.getSelectedFile();
                        field.fromFile(filer.getName());
                        sudokuGrid.setText(field.toString());
                        mainWindow.revalidate();
                        mainWindow.repaint();
                }
            } 
            } );
      setVisible(true);
  }

字段方法来自另一个名为Field的类,但它并不真正相关(我认为)。

以下是控制台所说的内容:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at Sudoku$1.loader(Sudoku.java:52)
        at Sudoku$1.actionPerformed(Sudoku.java:45)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

我不确定该怎么做,因为我真的不知道这意味着什么。有什么指针吗?

编辑:尝试David Colers代码后的新错误代码:

    Sudoku.java:49: error: method showOpenDialog in class JFileChooser cannot be app
lied to given types;
                                if(sumtin.showOpenDialog() == JFileChooser.APPRO
VE_OPTION)
                                         ^
  required: Component
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

2 个答案:

答案 0 :(得分:1)

你没有正确处理JFileChooser。 编辑:将此关键字更改为null。

JFileChooser sumtin = new JFileChooser();
if(sumtin.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
{
        File filer = sumtin.getSelectedFile();
        field.fromFile(filer.getName());
        sudokuGrid.setText(field.toString());
        mainWindow.revalidate();
        mainWindow.repaint();
}

答案 1 :(得分:0)

你错过了几步:

首先创建一个filechooser

JFileChooser fileChooser = new JFileChooser();

显示它,并获得结果

int result = fileChooser.showOpenDialog(this);

如果用户打开了一个文件,你可以得到它并做你想做的事情

if (result == JFileChooser.APPROVE_OPTION) {
    File file = fileChooser.getSelectedFile();
    ...
}