2013-07-01 2 views
0

Я использую класс Inner для первого. Я пытаюсь получить доступ к переменной 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(); 
      } 
     }); 
    } 
} 

и это код, в котором я получаю ошибку -

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 линии - column = table.getColumnModel().getColumn(i); Я получаю сообщение об ошибке, как - variable table is not found

Пожалуйста, помогите.

ответ

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 
} 
Смежные вопросы