2011-10-29 10 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は変更されません。

これで準備が整いました。私は、右のキーの検証ラインをコメントアウトすると、左のものは約半分の時間で動作します。そこには何が起こっているのですか?あなたが自分のために(1つのファイルだけ)実行して見たい場合は、残りのコードを次に示します: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

関連する問題