为什么.validate()不会更新此代码中的contentPane?

时间:2011-10-29 05:22:16

标签: java swing jframe containers validation

我在使用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);
    }
}

图表只是一个组件,很容易。当我点击右箭头时,我想用数组中的下一个替换当前显示的Graph,当我点击左箭头时,我想用数组中的前一个替换Graph。

奇怪的是,当我向右击时,它的效果很好。但是,当我向左打时,图表不会改变。索引发生了变化,因此我知道代码已经到达,但GUI不会改变。

现在为此做好准备。当我注释掉右键的验证行时,左侧的键将会工作一半左右。那里发生了什么?如果你想运行并查看自己(只有一个文件),这是代码的其余部分:http://pastebin.com/qWxWrypK。我正在使用的起始参数是T = 1,dt = .01,L = 1,h = .05。

我正在研究它,我认为这可能是因为JFrame的contentPane实际上是一个JPanel,但这种思路并没有得到任何结论......

感谢您的帮助

编辑:

所以我还在努力。这是另一个奇怪的事情。如果我将KeyList类中的索引设置为timeSlices-1(基本上是图形数组中的最后一个Graph),并且我向左击,它就可以了!但是,现在没有权利!数组之类的东西很奇怪,因为索引变化很好。 HMM。

编辑:

阵列正在发生一些事情。出于某种原因,图表只能使用一次。也许它在被拆除时被摧毁了?或类似的......

1 个答案:

答案 0 :(得分:1)

不是尝试删除/添加面板到容器,而是使用专为此目的而设计的CardLayout

另外,不要使用KeyListeners。相反,您应该使用Key Bindings。然后,您只需将下一个/上一个键绑定到卡片布局的下一个/上一个方法。