2013-07-01 93 views
0

我使用第一個內部類。我正嘗試訪問在外部類中聲明的變量table,內部類MyTableModel。但netbeans顯示錯誤 - Cannot find symbol從內部類訪問外部類成員

這是完整的代碼。

Import Statements 
public class TableDemo extends JPanel { 
    private boolean DEBUG = true; 

    public TableDemo() { 
     super(new GridLayout(1,0)); 

     JTable table = new JTable(new MyTableModel()); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 

     JScrollPane scrollPane = new JScrollPane(table); 

     add(scrollPane); 
    } 

    class MyTableModel extends AbstractTableModel { 
     private String[] columnNames = {"First Name","Last Name","Sport","# of Years","Dada","Vegiterian"}; 
     private Object[][] data = { 
     {"Kathy", "Smith", 
     "Snowboarding", new Integer(5), new Boolean(false),new Boolean(false)}, 

     }; 

     public int getColumnCount() { 
      return columnNames.length; 
     } 

     public int getRowCount() { 
      return data.length; 
     } 

     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     public Object getValueAt(int row, int col) { 
      return data[row][col]; 
     } 
     public Class getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 

     public boolean isCellEditable(int row, int col) { 
      if (col < 2) { 
       return false; 
      } else { 
       return true; 
      } 
     } 

     public void setValueAt(Object value, int row, int col) { 

     } 

     private void printDebugData() { 

      TableColumn column = null; 
      for (int i = 0; i < 5; i++) { 
      column = table.getColumnModel().getColumn(i); 
      if (i == 2) { 
       column.setPreferredWidth(100); //third column is bigger 
      } else { 
       column.setPreferredWidth(50); 
    } 
} 
      int numRows = getRowCount(); 
      int numCols = getColumnCount(); 

      for (int i=0; i < numRows; i++) { 
       System.out.print(" row " + i + ":"); 
       for (int j=0; j < numCols; j++) { 
        System.out.print(" " + data[i][j]); 
       } 
       System.out.println(); 
      } 
      System.out.println("--------------------------"); 
     } 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("TableDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     TableDemo newContentPane = new TableDemo(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

,這是在我收到錯誤的代碼 - 我收到錯誤,如column = table.getColumnModel().getColumn(i); - - variable table is not found

請幫

for (int i = 0; i < 5; i++) { 
      column = table.getColumnModel().getColumn(i); 
      if (i == 2) { 
       column.setPreferredWidth(100); //third column is bigger 
      } else { 
       column.setPreferredWidth(50); 
    } 

INT線。

回答

0

您在構造函數中,而不是作爲一個實例成員定義變量。構造函數代碼結束後,該變量超出了範圍。你需要做的是這樣的:

public class TableDemo extends JPanel { 
    private boolean DEBUG = true; 
    private JTable table; 

    public TableDemo() { 
     super(new GridLayout(1,0)); 

     table = new JTable(new MyTableModel()); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 

     JScrollPane scrollPane = new JScrollPane(table); 

     add(scrollPane); 
    } 

    // Rest of code 
+0

請不,這不是一個類('static')成員,你的意思,但一個實例成員。 –

+0

你說得對。但我認爲這個例子足夠描述。無論如何,我會編輯。 – Avi

0

您在構造函數中僅聲明變量本地。構造函數消失後(超出範圍),變量消失了。要正確地做到這一點,你應該在一個字段定義它:

public class TableDemo extends JPanel { 

    private boolean DEBUG = true; 
    private JTable table; //define here 

    public TableDemo() { 
     super(new GridLayout(1,0)); 
     table = new JTable(new MyTableModel()); //remove Type here 
0

你需要一個實例變量在一個內部類訪問它。你的變量對構造函數只有局部範圍,因此構造函數之外沒有任何東西可以找到它。

你的代碼更改爲:

public class TableDemo extends JPanel { 
    private JTable table; 

    public TableDemo() { 
     table = new JTable(new MyTableModel()); 
     //more code 
    } 
    // more code 
}