2011-10-29 3 views
0

contentPane에 문제가 있습니다. 문제의 코드는 다음과 같습니다.왜이 코드에서 contentPane을 .validate()하지 않습니까?

public void graph() { 
    JFrame frame = new JFrame("Graph"); 
    Graph[] graphs = new Graph[timeSlices]; 
    int k = 0; 

    for (TreeMap<MyPoint, BigDecimal> prevU : prevUs) { 
     graphs[k] = new Graph(prevU); 
     k++; 
    } 

    // The KeyList handles switching between graphs. 
    frame.addKeyListener(new KeyList(frame.getContentPane(), graphs)); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(810, 500); 
    frame.setVisible(true); 
} 

private class KeyList extends KeyAdapter { 
    private Container contentPane; 
    private Graph[] graphs; 
    private int index; 

    public KeyList(Container contentPane, Graph[] graphs) { 
     this.contentPane = contentPane; 
     this.graphs = graphs; 
     this.index = 0; 

     this.contentPane.add(this.graphs[0]); 
    } 

    public void keyPressed(KeyEvent e) { 
     // Go back a time step 
     if (e.getKeyCode() == KeyEvent.VK_LEFT && index > 0) { 
      contentPane.remove(graphs[index]); 
      contentPane.add(graphs[--index]); 
      contentPane.validate(); 
      System.out.println(index); 
     } 
     // Go forward a time step 
     else if (e.getKeyCode() == KeyEvent.VK_RIGHT && index < timeSlices - 1) { 
      contentPane.remove(graphs[index]); 
      contentPane.add(graphs[++index]); 
      contentPane.validate(); 
      System.out.println(index); 
     } 
     // Exit if Esc is hit 
     else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) 
      System.exit(0); 
    } 
} 

그래프는 단지 구성 요소이며 쉽게 알 수 있습니다. 오른쪽 화살표를 누르면 현재 표시된 그래프를 배열의 다음 그래프로 바꾸고 싶습니다. 왼쪽 화살표를 누르면 배열의 이전 화살표로 그래프를 교체하고 싶습니다.

이상한 일은 내가 맞을 때 잘 작동한다는 것입니다. 그러나 왼쪽을 누르면 그래프가 변경되지 않습니다. 색인이 변경되어 코드에 도달했음을 알지만 GUI는 변경되지 않습니다.

이제 준비하십시오. 오른쪽 키의 유효성 검사 행을 주석 처리하면 왼쪽 키가 약 절반의 시간 동안 작동합니다. 거기 무슨 일 이니? 실행하고 자기 (한 파일 만)를보고 싶다면 다음 코드의 나머지 부분은 http://pastebin.com/qWxWrypK입니다. 현재 사용중인 시작 매개 변수는 T = 1, dt = .01, L = 1, h = .05입니다. 어떤 도움

에 대한

나는 그것으로보고, 나는 JFrame의의의 contentPane 정말 JPanel의, 그러나 생각의 그 선이 어디하지 않았기 때문에 그것이있을 거라고 생각했다

...

감사합니다

편집 :

그래서 아직 작업하고 있습니다. 또 다른 이상한 점이 있습니다. KeyList 클래스의 인덱스를 timeSlices-1로 설정하면 (기본적으로 그래프 배열의 마지막 그래프가 표시됨) 왼쪽으로 치면 작동합니다! 하지만 지금은 그렇지 않습니다! 색인이 바뀌기 때문에 이상한 일이 배열이나 무언가에서 계속되어야합니다. 흠.

편집 :

배열에 문제가 발생했습니다. 어떤 이유로 그래프는 한 번만 사용할 수 있습니다. 아마도 그것은 제거시 파괴되고 있습니까? 아니면 뭐 그런 ...

+0

프로그램을 실행하는 매개 변수 값을 게시물에 추가하십시오. 그들 없이는 나는 당신의 프로그램을 시작할 수조차 없다. – MockerTim

+0

죄송합니다. 내가 그렇게하는 것을 잊어 버렸습니다. (나는 처음부터 하드 코딩을했습니다.) – mtheoryninja

답변

1

컨테이너에 패널을 제거/추가하는 대신이 목적으로 설계된 CardLayout을 사용하십시오.

또한 KeyListeners를 사용하지 마십시오. 대신 Key Bindings을 사용해야합니다. 그런 다음 다음/이전 키를 카드 레이아웃의 다음/이전 방법에 바인드하면됩니다.

+0

감사! 그게 꼭 필요한 것 같아! 또한 Key Bindings에 대한 팁을 주셔서 감사합니다. – mtheoryninja

관련 문제