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

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

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.(Plotter.java:37) at Plotter.main(Plotter.java:325) 

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

此行被注释但未使用时也不会发生exception:

 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 = 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 eqList = new ArrayList(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"); } } } 

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

对于滑块我正在使用这个问题的答案,对于图形部分,我正在使用这个程序 (特别是Plotter.java文件)。

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

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

它应该是这样的(白色面板是绘制图形的位置): 在此处输入图像描述