2011-10-29 44 views
0

我在使用contentPane時遇到問題。這裏的代碼有問題:爲什麼在這個代碼中不會更新contentPane。

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); 
    } 
} 

圖只是一個組件,容易peasy。當我點擊右箭頭時,我想用數組中的下一個替換當前顯示的Graph,當我點擊左箭頭時,我想用圖中的前一個替換Graph。

奇怪的是,當我打右,它工作得很好。但是,當我左擊時,Graph不會改變。索引改變了,因此我知道代碼已經到達,但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