2015-01-29 4 views
1

저는 Java로는 꽤 새로운데, 언젠가는 매우 간단하지만 문제를 해결하기 위해 고심하고 있습니다.하지만 해결할 수는 없습니다. 두 개의 공용 클래스가 있는데, 둘 다 외부 클래스의 내부 클래스입니다. 처음에는 눈 추적 장치에서 데이터를 얻습니다. 두 번째 작품에서는 이미지 위에 페인트하고 싶습니다. 나는 데이터를 올바르게 얻어 arraylist에 저장하지만, 두 번째 방법으로 사용하면 빈 arraylist가됩니다. 여기 코드 : 즉JAVA : 하나의 클래스에서 다른 클래스로 값 전달하기

import ... 

public class TETSimple { 
    //static LoadImageApp image = new LoadImageApp(); 

    public ArrayList x1; 
    public ArrayList y1; 

    public static void main(String[] args) { 
     final GazeManager gm = GazeManager.getInstance(); 
     boolean success = gm.activate(ApiVersion.VERSION_1_0, ClientMode.PUSH); 

     final GazeListener gazeListener = new GazeListener(); 
     gm.addGazeListener(gazeListener); 

     JFrame f = new JFrame("Immagine"); 

     LoadImageApp a = new LoadImageApp(); 
     f.add(a); 
     f.pack(); 
     f.setVisible(true); 

     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       gm.removeGazeListener(gazeListener); 
       gm.deactivate(); 
      } 
     }); 
    } 


    public static class GazeListener 
     implements IGazeListener { 

     private ArrayList<Double> x1 = new ArrayList<Double>(); 
     private ArrayList<Double> y1 = new ArrayList<Double>(); 

     public ArrayList getX1() { 
      return this.x1; 

     } 

     public ArrayList getY1() { 
      return this.y1; 
     } 

     public void setX1(ArrayList l1) { 
      x1 = l1; 
     } 

     public void setY1(ArrayList l2) { 
      x1 = l2; 
     } 

     @Override 
     public void onGazeUpdate(GazeData gazeData) { 
      Double xcor = gazeData.smoothedCoordinates.x; 
      Double ycor = gazeData.smoothedCoordinates.y; 

      x1.add(new Double(xcor)); 
      y1.add(new Double(ycor)); 

      //System.out.println(x1.toString()); --> it works and returns all the values detected and added into the array 
     } 
    } 

    public static class LoadImageApp 
     extends Component { 
     BufferedImage img; 

     public Integer x; 
     public Integer y; 

     public void paint(Graphics g) { 
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
      Double screenW = screenSize.getWidth(); 
      Double screenH = screenSize.getHeight() * 0.95; 

      int screenWidth = screenW.intValue(); 
      int screenHeight = screenH.intValue(); 

      // Dimensioni dell'immagine 
      if (img == null) { 
       return; 
      } 
      int imageWidth = img.getWidth(this); 
      int imageHeight = img.getHeight(this); 
      g.drawImage(img, 0, 0, screenWidth, screenHeight, 0, 0, imageWidth, imageHeight, null); 
      GazeListener a = new GazeListener(); 
      System.out.println(a.getX1().toString()); //--> doesn't work, return an empty array 

      if (a.x1 != null && !a.x1.isEmpty() && a.y1 != null && !a.y1.isEmpty()) { 
       Double currentx = a.x1.get(a.x1.size() - 1); 
       Double currenty = a.y1.get(a.x1.size() - 1); 
       System.out.println(currentx); 
      } else { 
       System.out.println("empty array"); 
      } 
     } 

     // costruttore della classe: 
     public LoadImageApp() { 
      try { 
       img = ImageIO.read(new File("C:picture.jpg")); 
      } catch (IOException e) { 
      } 
     } 

     public Dimension getPreferredSize() { 
      if (img == null) { 
       return new Dimension(100, 100); 
      } else { 
       return new Dimension(img.getWidth(null), img.getHeight(null)); 
      } 
     } 
    } 

은, 내가 뭘하고 싶은 클래스 GazeListener의 방법 onGazeUpdate()와 데이터 X1과 X2를 감지 한 다음이 데이터를 사용할 수있게하는 것입니다 LoadImageApp 클래스의 메소드 paint (Graphics g)

또한이 목적을 위해 set/get 메서드를 설정했지만 여전히 뭔가 잘못 알고 있습니다.

무엇이 잘못 되었나요?

미리 감사드립니다.

+0

'public ArrayList x1;'왜 원시 타입을 사용하고 있습니까? – EpicPandaForce

답변

0

LoadImageApp.paint 메서드 안에 GazeListener 인스턴스를 새로 만듭니다. 새 인스턴스는 main에서 생성 한 인스턴스에 대해 아무것도 모릅니다. LoadImageApp a= new LoadImageApp(gazeListener); :

이 문제를 해결하는 방법은 final GazeListener gazeListener = new GazeListener();main에를 만든 다음 생성자 인수로 app에 전달하는 것입니다. 그런 다음 필드로이를 저장하고 페인트에서 대신 당신이 당신의 GazeListener 및 LoadImageApp "내부 클래스"라는 추가 참고로 paint

내부에 새로운 인스턴스를 생성하는 분야를 참조하십시오. 그들은 내부 수업이 아니라 static member classes입니다. 그들이 마치 inner classes 인 것처럼 행동하기를 바라면 그들은 그렇게하지 않을 것입니다. 내부 클래스를 사용하면 부모 인스턴스의 필드에 액세스 할 수 있습니다. 수업에 static 수식어가있어서 수업에 액세스 할 수 없습니다.

public static class LoadImageApp 
    extends Component { 
    private GazeListener gazeListener; 
    public LoadImageApp(GazeListener aGazeListener) { 
     this.gazeListener = aGazeListener; 
    } 
    ... 
    public void paint(Graphics g) { 
     ... 
     // don't do the next line 
     //GazeListener a = new GazeListener(); 
     //System.out.println(a.getX1().toString()); //--> doesn't work, return an empty array 
     System.out.println(this.gazeListener.getX1().toString()); 
     ... 
    } 
} 
+0

감사합니다. 나는 완벽하게 이해했습니다. 이제 작동합니다. – jessyjemy

-1

페인트 방법에서 GazeListener의 새 인스턴스를 만들고 "a"라고 부릅니다. 이 "a"는 새 인스턴스이고 데이터를 추가하지 않으므로 비어 있습니다.

+1

오른쪽! 고맙습니다 – jessyjemy

관련 문제