Help with Non-Static/Static problem

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • HxRLxY
    New Member
    • Sep 2008
    • 23

    Help with Non-Static/Static problem

    I am having a compile-time problem with a simple program I am writing. When I attempt to compile, I get the error "non-static variable this cannot be referenced from a static context". The error point to where I try to create a new instance of 'ConvertToOunce s' inside the main method. Any help would be greatly appreciated.

    Here is my source code.

    Code:
    /******************************************************************************\
    |
    |Try to make gui for both Projects 2a and 2b
    |
    |
    \******************************************************************************/
    
       import javax.swing.*;
       import javax.swing.JOptionPane.*;
       import java.awt.*;
       import java.awt.event.*;
    
        public class WeightConverter extends JPanel{
        
         	 //main method will instantiate and display GUI
       
           public static void main(String[] args){
          
             JFrame frame = new JFrame("Weight Converter");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          	
             JTabbedPane pane = new JTabbedPane();
             pane.addTab ("Convert To Ounces", new ConvertToOuncesPane());
          
          }
          //ConvertToOuncesPane class will create the pane for converting to ounces. 
           class ConvertToOuncesPane{
          	
          	//Set up new component identifiers
             JLabel tonsLabel, stonesLabel, poundsLabel, ouncesLabel, resultLabel;
             JTextField tonsField, stonesField, poundsField, ouncesField;
             JButton btnConvert, btnClear, btnExit;
             String resultString = "Total Number of Ounces: ";
          	
          	/*****************************************************************************\
          	|
          	|this method will be the primary constructor method for the class
          	|
          	\*****************************************************************************/
              public ConvertToOuncesPane(){
             
             	//set up the labels for the input boxes
                tonsLabel = new JLabel("Enter number of tons:");
                stonesLabel = new JLabel("Enter number of stones:");
                poundsLabel = new JLabel("Enter number of pounds:");
                ouncesLabel = new JLabel("Enter number of pounds:");
                resultLabel = new JLabel(resultString + "---");
                
             	//set up the input boxes
                tonsField = new JTextField(10);
                stonesField = new JTextField(10);
                poundsField = new JTextField(10);
                ouncesField = new JTextField(10);
             	
             	//set up the convert button and add action listener
                btnConvert = new JButton("Convert");
                btnConvert.addActionListener (new ConvertToListener());
             	
             	//set up the clear button and add action listener
                btnClear = new JButton("Clear");
                btnClear.addActionListener (new ClearToListener());
             	
             	//set up the exit button and add action listener
                btnExit = new JButton("Exit");
                btnExit.addActionListener (new ExitToListener());
                
             	//add components to the pane
                add (tonsLabel);
                add (tonsField);
                add (stonesLabel);
                add (stonesField);
                add (poundsLabel);
                add (poundsField);
                add (ouncesLabel);
                add (ouncesField);
                add (resultLabel);
                add (btnConvert);
                add (btnClear);
                add (btnExit);
                
             	//set default values for textFields
                tonsField.setText("0");
                stonesField.setText("0");
                poundsField.setText("0");
                ouncesField.setText("0");
             	
             	//set up the look of the pane
                setBackground(Color.white);
                setPreferredSize(new Dimension(200, 280));
             	  
             	
             
             }
          
            /**********************************************************************\
            |
            |the ConvertToListener class is dedicated to the convert button 
            |on the Convert To Ounces Pane
            |
            \**********************************************************************/ 
              private class ConvertToListener implements ActionListener{
             
                 public void actionPerformed(ActionEvent event){
                
                	//set up variables for the ConvertListener class
                   int tons = 0, stones = 0, pounds = 0, ounces = 0, totalOunces = 0;
                   final int CONVERT_TONS = 32000, CONVERT_STONES = 224, CONVERT_POUNDS = 16;
                   String errorMessage = "You must enter a number.";
                   boolean testField;
                
                	//collect, test, and parse integers from each textField
                   	//test tonsField
                   testField = testInt(tonsField.getText());
                	
                   if (testField == true)
                      tons = Integer.parseInt(tonsField.getText());
                   else
                      JOptionPane.showMessageDialog(null, errorMessage);
                		
                		//test stonesField
                   testField = testInt(stonesField.getText());
                	
                   if (testField == true)
                      stones = Integer.parseInt(stonesField.getText());
                   else
                      JOptionPane.showMessageDialog(null, errorMessage);
                		
                		//test poundsField
                   testField = testInt(poundsField.getText());
                	
                   if (testField == true)
                      pounds = Integer.parseInt(poundsField.getText());
                   else
                      JOptionPane.showMessageDialog(null, errorMessage);
                		
                		//test ouncesField
                   testField = testInt(ouncesField.getText());
                	
                   if (testField == true)
                      ounces = Integer.parseInt(ouncesField.getText());
                   else
                      JOptionPane.showMessageDialog(null, errorMessage);
                		
                	//perform the conversion calculation
                   totalOunces = tons * CONVERT_TONS + stones * CONVERT_STONES + pounds * CONVERT_POUNDS + ounces;
                	
                	//display the result
                   resultLabel.setText(resultString + totalOunces);	
                }
             	
             	//set up a try-catch in the event a letter is entered into a field
                 boolean testInt(String test){
                   try{
                      Integer.parseInt(test);
                   }
                       catch(NumberFormatException exception){
                         return false;
                      }
                   return true;
                }
             	
             	
             	
             
             }
             /***************************************************************************\
          	|
          	|the ClearToListener class is dedicated to the Clear button on 
          	|the Convert To Ounces Pane
          	|
          	\***************************************************************************/
              private class ClearToListener implements ActionListener{
             	 
             	 /****************************************************************\
             	 |
             	 |this method will restore the default zeros to all text fields
             	 |
             	 \****************************************************************/
                 public void actionPerformed(ActionEvent event){
                 	//restore default values to textFields
                   tonsField.setText("0");
                   stonesField.setText("0");
                   poundsField.setText("0");
                   ouncesField.setText("0");
                	
                }
             }
             /*******************************************************************************\
          	|
          	|the ExitToListener class is dedicated to the Exit button on the
          	|Convert To Ounces Pane
          	|
          	\*******************************************************************************/
          	
              private class ExitToListener implements ActionListener{
             	/***********************************************************\
             	|
             	|this method will end the program when the user 
             	|clicks the exit button
             	|
             	\***********************************************************/	
                 public void actionPerformed(ActionEvent event){
                   System.exit(0);
                }
             }
          	
          }
          	
          
          
          
       }
  • r035198x
    MVP
    • Sep 2006
    • 13225

    #2
    That can't be the error you are getting now with that code. You haven't used this at all in that main method. Your call to addTab however is incorrect. The closest overload for that method takes a String and a Component. You are passing a string as the first parameter (correct) but passing a ConvertToOunces Pane object which is not a Component as the second parameter and that won't compile.

    Comment

    • JosAH
      Recognized Expert MVP
      • Mar 2007
      • 11453

      #3
      That ConvertToOunces Pane is an inner class. Objects of inner class types are
      tied to an object of the outer class. You don't have an object of the outer class
      so you can't instantiate (new) an object of that inner class in your main method
      which runs in a static context (read: no object(s) in scope).

      You either make an object of the outer class or make that inner class a static
      class, a so called static nested class.

      kind regards,

      Jos

      Comment

      • HxRLxY
        New Member
        • Sep 2008
        • 23

        #4
        Thank you for the help so far. I changed my inner class to be a static class and all seems well, except that in my main method where i try 'pane.addTab' i get a cannot find symbol error. My text book shows that i have the syntax right, but I still can't get it to work.

        Here is my revised source code:

        Code:
        import javax.swing.*;
           import javax.swing.JOptionPane.*;
           import javax.swing.JTabbedPane.*;
           import java.awt.*;
           import java.awt.event.*;
        
            public class WeightConverter extends JPanel{
            
             	 //main method will instantiate and display GUI
           
               public static void main(String[] args){
              
                 JFrame frame = new JFrame("Weight Converter");
                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              	
                 JTabbedPane pane = new JTabbedPane();
                 ConvertToOuncesPane panel_1 = new ConvertToOuncesPane();
                 
                 pane.addTab("Convert", panel_1);
              	
                 frame.getContentPane().add(pane);
                 frame.pack();
                 frame.setVisible(true);
              }
              //ConvertToOuncesPane class will create the pane for converting to ounces. 
               static class ConvertToOuncesPane{
              	
              	//Set up new component identifiers
                 JLabel tonsLabel, stonesLabel, poundsLabel, ouncesLabel, resultLabel;
                 JTextField tonsField, stonesField, poundsField, ouncesField;
                 JButton btnConvert, btnClear, btnExit;
                 String resultString = "Total Number of Ounces: ";
              	
              	/*****************************************************************************\
              	|
              	|this method will be the primary constructor method for the class
              	|
              	\*****************************************************************************/
                  public ConvertToOuncesPane(){
                 
                 	//set up the labels for the input boxes
                    tonsLabel = new JLabel("Enter number of tons:");
                    stonesLabel = new JLabel("Enter number of stones:");
                    poundsLabel = new JLabel("Enter number of pounds:");
                    ouncesLabel = new JLabel("Enter number of pounds:");
                    resultLabel = new JLabel(resultString + "---");
                    
                 	//set up the input boxes
                    tonsField = new JTextField(10);
                    stonesField = new JTextField(10);
                    poundsField = new JTextField(10);
                    ouncesField = new JTextField(10);
                 	
                 	//set up the convert button and add action listener
                    btnConvert = new JButton("Convert");
                    btnConvert.addActionListener (new ConvertToListener());
                 	
                 	//set up the clear button and add action listener
                    btnClear = new JButton("Clear");
                    btnClear.addActionListener (new ClearToListener());
                 	
                 	//set up the exit button and add action listener
                    btnExit = new JButton("Exit");
                    btnExit.addActionListener (new ExitToListener());
                    
                 	//add components to the pane
                    JFrame frame = new JFrame();
                    frame.add (tonsLabel);
                    frame.add (tonsField);
                    frame.add (stonesLabel);
                    frame.add (stonesField);
                    frame.add (poundsLabel);
                    frame.add (poundsField);
                    frame.add (ouncesLabel);
                    frame.add (ouncesField);
                    frame.add (resultLabel);
                    frame.add (btnConvert);
                    frame.add (btnClear);
                    frame.add (btnExit);
                    
                 	//set default values for textFields
                    tonsField.setText("0");
                    stonesField.setText("0");
                    poundsField.setText("0");
                    ouncesField.setText("0");
                 	
                 	//set up the look of the pane
                    frame.setBackground(Color.white);
                    frame.setPreferredSize(new Dimension(200, 280));
                 	  
                 	
                 
                 }
              
                /**********************************************************************\
                |
                |the ConvertToListener class is dedicated to the convert button 
                |on the Convert To Ounces Pane
                |
                \**********************************************************************/ 
                  private class ConvertToListener implements ActionListener{
                 
                     public void actionPerformed(ActionEvent event){
                    
                    	//set up variables for the ConvertListener class
                       int tons = 0, stones = 0, pounds = 0, ounces = 0, totalOunces = 0;
                       final int CONVERT_TONS = 32000, CONVERT_STONES = 224, CONVERT_POUNDS = 16;
                       String errorMessage = "You must enter a number.";
                       boolean testField;
                    
                    	//collect, test, and parse integers from each textField
                       	//test tonsField
                       testField = testInt(tonsField.getText());
                    	
                       if (testField == true)
                          tons = Integer.parseInt(tonsField.getText());
                       else
                          JOptionPane.showMessageDialog(null, errorMessage);
                    		
                    		//test stonesField
                       testField = testInt(stonesField.getText());
                    	
                       if (testField == true)
                          stones = Integer.parseInt(stonesField.getText());
                       else
                          JOptionPane.showMessageDialog(null, errorMessage);
                    		
                    		//test poundsField
                       testField = testInt(poundsField.getText());
                    	
                       if (testField == true)
                          pounds = Integer.parseInt(poundsField.getText());
                       else
                          JOptionPane.showMessageDialog(null, errorMessage);
                    		
                    		//test ouncesField
                       testField = testInt(ouncesField.getText());
                    	
                       if (testField == true)
                          ounces = Integer.parseInt(ouncesField.getText());
                       else
                          JOptionPane.showMessageDialog(null, errorMessage);
                    		
                    	//perform the conversion calculation
                       totalOunces = tons * CONVERT_TONS + stones * CONVERT_STONES + pounds * CONVERT_POUNDS + ounces;
                    	
                    	//display the result
                       resultLabel.setText(resultString + totalOunces);	
                    }
                 	
                 	//set up a try-catch in the event a letter is entered into a field
                     boolean testInt(String test){
                       try{
                          Integer.parseInt(test);
                       }
                           catch(NumberFormatException exception){
                             return false;
                          }
                       return true;
                    }
                 	
                 	
                 	
                 
                 }
                 /***************************************************************************\
              	|
              	|the ClearToListener class is dedicated to the Clear button on 
              	|the Convert To Ounces Pane
              	|
              	\***************************************************************************/
                  private class ClearToListener implements ActionListener{
                 	 
                 	 /****************************************************************\
                 	 |
                 	 |this method will restore the default zeros to all text fields
                 	 |
                 	 \****************************************************************/
                     public void actionPerformed(ActionEvent event){
                     	//restore default values to textFields
                       tonsField.setText("0");
                       stonesField.setText("0");
                       poundsField.setText("0");
                       ouncesField.setText("0");
                    	
                    }
                 }
                 /*******************************************************************************\
              	|
              	|the ExitToListener class is dedicated to the Exit button on the
              	|Convert To Ounces Pane
              	|
              	\*******************************************************************************/
              	
                  private class ExitToListener implements ActionListener{
                 	/***********************************************************\
                 	|
                 	|this method will end the program when the user 
                 	|clicks the exit button
                 	|
                 	\***********************************************************/	
                     public void actionPerformed(ActionEvent event){
                       System.exit(0);
                    }
                 }
              	
              }
              	
              
              
              
           }

        Comment

        • JosAH
          Recognized Expert MVP
          • Mar 2007
          • 11453

          #5
          Read the API documentation: the addTab method adds a tab which must be a
          Component. Your ConvertToOunces Pane class isn't a Component.

          kind regards,

          Jos

          Comment

          Working...