0

在下面的 Java 代码中,我在一个类中填充 ArrayList,然后在另一个类中使用 ArrayList。但是,数组传输但填充了空值。我已经调试了代码并且 ArrayList 确实被填充了,但它的值没有传输。

头等舱:

public String[] log = new String[100];
public ArrayList llog= new ArrayList();
int arraypos= 0;
public void nativeKeyPressed(NativeKeyEvent e) {
  if (e.getKeyCode() == NativeKeyEvent.VK_ESCAPE) {
    GlobalScreen.unregisterNativeHook();
  }
  System.out.println(" " + NativeKeyEvent.getKeyText(e.getKeyCode()).toLowerCase() + " ");
  llog.add(NativeKeyEvent.getKeyText(e.getKeyCode()).toString().toLowerCase());
  System.out.println("list:" + llog.get(arraypos));
  arraypos = arraypos + 1;  
}

public ArrayList getStrokes (){
  return this.llog;
}

二等:

public void TeslaTimer()
{
  int delay = 10000; //1 sec = 1000 
  int period = 90000; // repeat every sec.

  Timer timer = new Timer();
  timer.scheduleAtFixedRate(new TimerTask()
  {
    @Override
    public void run()
    {
      GlobalKeyListener keyl = new GlobalKeyListener();
      ArrayList keylog=keyl.getStrokes();

      //TeslaLogger savetoFile = new TeslaLogger();
      //savetoFile.TeslaLogger(keylog);
      System.out.println("Ring Ring");
      for(int i =0; i < keylog.size(); i++){
        System.out.println(keylog.get(i));
      }
    }
  }, delay, period);
}
4

2 回答 2

3

GlobalKeyListenerin的实例TeslaTimer与您要添加的实例不同 - 它们是不同的对象,每个对象都有自己的列表。

您必须使相同的实例GlobalKeyListener可用于您的run()方法,或者可能使用static变量(类似于全局变量)。


这是您可以用来使其工作的单例模式:

public class GlobalKeyListener {

    // rest of class omitted
    private static GlobalKeyListener INSTANCE = new GlobalKeyListener();

    public static GlobalKeyListener getInstance() { 
        return INSTANCE;
    }

}

然后在您需要在本地使用它的任何地方:

GlobalKeyListener globalKeyListener = GlobalKeyListener.getInstance();
globalKeyListener.getStrokes(); // etc

然后所有代码将使用相同的实例。

于 2012-11-11T21:02:00.410 回答
1

您创建了一个新的 GlobalKeyListener,它创建了 GlobalKeyListener 类的一个实例。这个类的实例将运行以下行: public ArrayList llog= new ArrayList(); (从而创建一个没有元素的新数组列表)。然后尝试获取数组列表 keylog=keyl.getStrokes(),并给出空数组列表。如果您希望数组列表在类的实例化之间保持不变,请尝试将 llog 数组列表设为静态。这将使您的第一个类的所有实例共享 llog 数组。这有意义吗?

于 2012-11-11T20:57:16.090 回答