将面板添加到框架时获取空指针异常

时间:2015-02-14 17:42:25

标签: java swing user-interface exception jpanel

更新:我试图通过使面板与另一个面板的制作方式解决问题,但我得到了这个异常

Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1040)
at java.awt.Container.add(Container.java:926)
at Plotter.createLayout(Plotter.java:48)
at Plotter.<init>(Plotter.java:37)
at Plotter.main(Plotter.java:325)

这是我从(Plotter.java)得到错误的代码: (我添加的部分是createsliderpanel(),slider,playButton和down)

此行未被注释且未使用时也不会发生异常:

c.add(sliderPanel , BorderLayout.SOUTH;

/

import java.util.*;
import java.io.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;


public class Plotter extends JFrame implements ActionListener
{   

private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu = new JMenu("File");
private JMenuItem openMenuItem = new JMenuItem("Open");
private JMenuItem saveMenuItem = new JMenuItem("Save");
private JMenuItem exitMenuItem = new JMenuItem("Exit");

private JComboBox eqCombo = new JComboBox();
private JButton addButton, removeButton, clearButton , playbutton ;
private Graph graph;
private JPanel userPanel , sliderPanel;
private JSlider slider;
private JTextField field;

public Plotter(double lowX, double highX, double frequency, String file) throws GraphArgumentsException, IOException
{
    super("Plotter");

    createNewGraph(lowX, highX, frequency, file);
    createLayout();
    createsliderpanel();
}

private void createLayout() throws GraphArgumentsException
{
    Container c = getContentPane();
    c.setLayout(new BorderLayout());
    setSize(600,500);
    c.add(graph, BorderLayout.CENTER);
    c.add(userPanel, BorderLayout.NORTH);
    c.add(sliderPanel , BorderLayout.SOUTH);
    createMenuBar();
}



/**
 * Creates a new Graph instance and adds equations from file into Graph
 * @param eqFile file where equations are stored
 * @throws IOException
 */
private void createNewGraph(double minX, double maxX, double freq, String eqFile) throws GraphArgumentsException, IOException
{
    Equation[] eq = null;
    graph = new Graph(minX, maxX, freq);

    eq = readEquationsFromFile(eqFile);

    if (eq != null)
        addEquation(eq);

    graph.setBackground(Color.WHITE);
    userPanel = createUserPanel(eq);
}

private void createMenuBar()
{
    menuBar.add(fileMenu);
    fileMenu.add(openMenuItem);
    fileMenu.add(saveMenuItem);
    fileMenu.addSeparator();
    fileMenu.add(exitMenuItem);
    openMenuItem.addActionListener(this);
    saveMenuItem.addActionListener(this);
    exitMenuItem.addActionListener(this);
    setJMenuBar(menuBar);
}

/**
 * Create user panel at top of the GUI for adding and editing functions
 * @param eq equation list to add into the combo box
 * @return panel containing buttons and an editable combo box
 */
private JPanel createUserPanel(Equation[] eq)
{
    JPanel up = new JPanel(new FlowLayout(FlowLayout.LEFT));
    eqCombo.setEditable(true);

    if (eq != null)
    {
        //Add all equations into the combo box
        for (int i = 0; i < eq.length; i++)
            eqCombo.addItem(eq[i].getPrefix());
    }

    addButton = new JButton("Add");
    removeButton = new JButton("Remove");
    clearButton = new JButton("Clear");

    addButton.addActionListener(this);
    removeButton.addActionListener(this);
    clearButton.addActionListener(this);

    up.add(eqCombo);
    up.add(addButton);
    up.add(removeButton);
    up.add(clearButton);


    return up;





}

// slider panel
private JPanel createsliderpanel()
{
    JPanel down = new JPanel(new FlowLayout(FlowLayout.LEFT));

    playbutton = new JButton("Play");
    slider = new JSlider();
    field = new JTextField();


    down.add(playbutton);
    down.add(slider);
    down.add(field);


    return down;
}



/**
 * Check action lister for button and menu events
 */
public void actionPerformed(ActionEvent e)
{
    if (e.getSource() == addButton)
        addEquation((String)eqCombo.getSelectedItem());
    else if (e.getSource() == removeButton)
        removeEquation(eqCombo.getSelectedIndex());
    else if (e.getSource() == saveMenuItem)
        saveEquationList();
    else if (e.getSource() == openMenuItem)
        loadEquations();
    else if (e.getSource() == clearButton)
        clearEquations();
    else if (e.getSource() == exitMenuItem)
        System.exit(0);
}

/**
 * Save equations to file
 *
 */
private void saveEquationList()
{
    try
    {
        PrintWriter out = new PrintWriter(new FileWriter("myeq.txt"));
        for (int i = 0; i < eqCombo.getItemCount(); i++)
            out.println(eqCombo.getItemAt(i));

        out.close();
    }
    catch (IOException e)
    {
        System.out.println(e);

    }
}


private void clearEquations()
{
    graph.removeAllEquations();
    eqCombo.removeAllItems();
}

/**
 * Load equations from file into graph
 *
 */
private void loadEquations()
{
    String file=null;
    JFileChooser fc = new JFileChooser();

    fc.showOpenDialog(null);
    if (fc.getSelectedFile() != null)
    {
        file = fc.getSelectedFile().getPath();

        try
        {
            Equation[] eq = readEquationsFromFile(file);
            if (eq != null)
            {
                clearEquations();
                addEquation(eq);

                //Restock combo box with new equations
                for (int i = 0; i < eq.length; i++)
                    eqCombo.addItem(eq[i].getPrefix());
            }
        }
        catch (IOException e)
        {
            JOptionPane.showMessageDialog(null, "ERR4: Unable to read or access file", "alert", JOptionPane.ERROR_MESSAGE);
        }
    }
}

/**
 * Add an equation to the Graph
 * @param eq equation
 */
private void addEquation(String eq)
{
    try
    {
        if (eq != null && !eq.equals(""))
        {
            Equation equation = new Equation(eq);
            eqCombo.addItem(eq);
            graph.addEquation(equation);
        }
    }
    catch (EquationSyntaxException e)
    {
        JOptionPane.showMessageDialog(null, "ERR2: Equation is not well-formed", "alert", JOptionPane.ERROR_MESSAGE);
    }
}
/**
 * Add multiple equations to Graph
 * @param eq equation array
 */
private void addEquation(Equation[] eq)
{
    for (int i = 0; i < eq.length; i++)
    {
        graph.addEquation(eq[i]);
    }
}

/**
 * Remove equation from Graph
 * @param index index to remove
 */
private void removeEquation(int index)
{
    if (index >= 0)
    {
        graph.removeEquation(index);
        eqCombo.removeItem(eqCombo.getSelectedItem());
    }
}

/**
 * Read file and extract equations into an array. Any errors on an equation halt the loading of the entire file
 * @param file name of file containing equations
 * @return array of equations
 * @throws IOException
 */
public Equation[] readEquationsFromFile(String file) throws IOException
{
    ArrayList<Equation> eqList = new ArrayList<Equation>(20);

    if (file == null)
        return null;

    String line;
    int lineCount = 1;
    try
    {
        BufferedReader br = new BufferedReader(new FileReader(file));
        while ((line = br.readLine()) != null)
        {
            Equation eq = new Equation(line);
            eqList.add(eq);
            lineCount++;
        }
        br.close();
        return ((Equation[])(eqList.toArray(new Equation[0])));
    }
    catch (EquationSyntaxException e)
    {
        JOptionPane.showMessageDialog(null, "ERR2.1: Equation on line " + lineCount + " is not well-formed", "alert", JOptionPane.ERROR_MESSAGE);
        return null;
    }
}

/**
 * Set up Plotter object and draw the graph.
 * @param args command line arguments for Plotter
 */
public static void main(String[] args)
{
    Scanner s = new Scanner(System.in);
    String eqFile = null;
    try
    {
        ///double minX = Double.parseDouble(args[0]);
    //  double maxX = Double.parseDouble(args[1]);
    //  double frequency = Double.parseDouble(args[2]);
        double minX = -10; 
        double maxX = 10; 
        double frequency = 0.01;

        if (args.length > 3)
            eqFile = args[3];

        Plotter plotterGUI = new Plotter(minX, maxX, frequency, eqFile);
        plotterGUI.setVisible(true);
        plotterGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
    catch (NumberFormatException e)
    {
        System.out.println("ERR: Invalid arguments");
    }
    catch (GraphArgumentsException e)
    {
        System.out.println(e.getMessage());
    }
    catch (IOException e)
    {
        System.out.print("ERR4: Unable to read or access file");
    }

    }
}

我正在尝试一个包含滑块,文本字段和框架按钮的面板

对于滑块我正在使用This question的答案,而对于图形部分我正在使用this program(特别是Plotter.java 文件)。

我的问题是关于该计划的一般外观。如何更改Plotter.java文件的GUI,使其看起来像下面的第二张图片?

这是Plotter.java GUI的外观: Plotter.java GUI

这就是它的样子(白色面板是绘制图形的地方): enter image description here

0 个答案:

没有答案