Почему .validate () не обновляет contentPane в этом коде? - PullRequest
0 голосов
/ 29 октября 2011

У меня проблемы с панелью контента.Вот код, о котором идет речь:

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.Когда я нажимаю стрелку вправо, я хочу заменить отображаемый в данный момент график на следующий в массиве, а когда нажимаю стрелку влево, я хочу заменить график на предыдущий в массиве.

Странная вещь в том, что когда я ударил правильно, это работает просто отлично.Однако, когда я нажимаю налево, график не меняется.Индекс меняется, поэтому я знаю, что код достигается, но графический интерфейс не меняется.

Теперь приготовьтесь к этому.Когда я закомментирую строку подтверждения правой клавиши, левая будет работать примерно половину времени.То, что там происходит?Вот остальная часть кода, если вы хотите запустить и посмотреть сами (только один файл): http://pastebin.com/qWxWrypK. Исходные параметры, которые я сейчас использую: T = 1, dt = .01, L = 1,h = .05.

Я смотрел на это, подумал, что это может быть потому, что contentPane JFrame действительно является JPanel, но такое мышление никуда не денется ...

Спасибо за любую помощь

Редактировать:

Так что я все еще работаю с этим.Вот еще одна странная вещь.Если я установлю индекс в классе KeyList на timeSlices-1 (в основном получая последний граф в массиве графиков) и нажму левую, это работает!Но сейчас права нет!Что-то странное должно происходить с массивом или что-то еще, потому что индекс меняется очень хорошо.Хм.

Редактировать:

Что-то происходит с массивом.По какой-то причине График может быть использован только один раз.Возможно, это уничтожается при удалении?Или что-то в этом роде ...

1 Ответ

1 голос
/ 29 октября 2011

Вместо того, чтобы пытаться удалить / добавить панели в контейнер, используйте CardLayout , который был разработан для этой цели.

Кроме того, не используйте KeyListeners. Вместо этого вы должны использовать Key Bindings . Затем вы просто привязываете следующие / предыдущие ключи к следующим / предыдущим методам макета карты.

...