0

次のJavaコードでは、あるクラスにArrayListを設定してから、別のクラスにArrayListを使用しています。ただし、配列は転送されますが、null値で埋められます。コードをデバッグしましたが、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 に答える