2016-05-29 30 views
0

我有一个JTable。当用户选择一列时,这个想法就是float数据被添加到一个ArrayList中。我会稍后尝试在arrayList上做一些统计。ArrayList在监听器外不可用

目前我正在管理将所需数据添加到ArrayList中,并且可以在侦听器中打印到控制台时看到数据。然而,即使ArrayList是从Listener之外声明的,数据仍然不在监听器之外。

 TableColumnModel columnModelCompareL = table_CompareL.getColumnModel(); 
     ArrayList<Float> statsCompareL=new ArrayList<Float>(); 
     columnModelCompareL.addColumnModelListener(new TableColumnModelListener() { 
        public void columnSelectionChanged(ListSelectionEvent e) { 
          Object[] data = columnToArray(table_CompareL,table_CompareL.getSelectedColumn()); 
         System.out.println("MY data length"+data.length); 
         try { 
          for(int i = 0; i < data.length; i++){ 
           if (data[i]!=null){ 
           try { 
            statsCompareL.add(Float.parseFloat((data[i]).toString().trim())); 
           } catch (Exception e1) { 
            System.out.println("nought to add here"); 
           } 
           } 
          } 
         } catch (NumberFormatException e1) { 
          System.out.println("You haven't selected a numeric column. Please select again"); 
         } 
        } 
        @Override 
        public void columnAdded(TableColumnModelEvent e) { 
        } 

        @Override 
        public void columnRemoved(TableColumnModelEvent e) { 
        } 

        @Override 
        public void columnMoved(TableColumnModelEvent e) { 
        } 

        @Override 
        public void columnMarginChanged(ChangeEvent e) { 
        } 
       }); 

     System.out.println("statsCompareL"+statsCompareL); 
+0

您是否尝试过声明在类中的任何方法之外的ArrayList这样它会成为你的类中提供anywere? – theVoid

+0

是的。我把它放在课堂的顶部。我想知道是不是因为我从监听器返回void,但似乎并没有列出ArrayList 而不是void –

+0

如果您希望最后一行代码行可以打印任何内容:它不会。因为该代码行在ui的创建过程中执行,但稍后调用监听器(用户与ui交互时)。 –

回答

1

更新的ArrayList是不是你的UI构造代码内可见的(因为这个代码完成长ArrayList的更新之前)。

然而其它事件侦听器中可用:

 TableColumnModel columnModelCompareL = table_CompareL.getColumnModel(); 
    ArrayList<Float> statsCompareL=new ArrayList<Float>(); 
    columnModelCompareL.addColumnModelListener(new TableColumnModelListener() { 
     // implementation left out for brevity 
    }); 

    // this runs during construction time, long before statsCompareL is updated 
    System.out.println("statsCompareL"+statsCompareL); 

    JButton testButton = new JButton("Test ArrayList"); 
    testButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // this runs after the button is clicked, so it will see the changes statsCompareL 
      System.out.println("statsCompareL"+statsCompareL); 
     } 
    }); 
    // add the button somewhere convenient for testing purposes