Обновление отображения текстовой панели в графическом интерфейсе

У меня больше проблем с "я безнадежен в программировании".

У меня есть фрагмент кода, который использует StringBuilder для отображения элементов массива в текстовой панели графического интерфейса при запуске программы. Вот код StringBuilder:

// memory tab
    StringBuilder mList = new StringBuilder();
    memLocList = new Memory[MEM_LOCATIONS];
    mem = new Memory();
    for (int i = 0; i < memLocList.length; i++) {
        memLocList[i] = mem;
        memLocList[i].setOpCode(00);
        mList.append(String.format("%10s %04x %10s %6s", "Address:   ", i,
                "Value:  ", memLocList[i].getOpCode()));
        mList.append("\n");
    }

JComponent memTab = makeTextPanel(mList.toString());
    tabs.addTab("Memory", new JScrollPane(memTab));

}

protected JComponent makeTextPanel(String t) {
    text = t;
    JPanel panel = new JPanel(false);
    JTextPane filler = new JTextPane();
    filler.setFont(new Font("Courier", Font.PLAIN, 14));
    filler.setText(text);
    filler.setAlignmentX(LEFT_ALIGNMENT);
    panel.setLayout(new GridLayout(1, 1));
    panel.add(filler);
    return panel;
}

Графический интерфейс также имеет панель ввода текста, где можно ввести строку шестнадцатеричных значений.

При нажатии кнопки пользователю предлагается ввести другое значение, соответствующее позиции в массиве, куда должно быть вставлено первое шестнадцатеричное значение.

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

Я нашел этот вопрос здесь, который похож, но я не уверен, что реализация шаблона Observer/Observable является правильным путем, и даже если это так, как бы я это сделал: Лучший способ постоянно обновлять элементы графического интерфейса

Мой первоначальный подход состоял в том, чтобы добавить метод «updateDisplay()», который я мог бы вызвать после обработки нажатия кнопки и повторно вызвать метод makeTextPanel:

public void updateDisplay() {

    makeTextPanel(text);
}

Я думал, что это может обновить его, но это не влияет на отображение.

Любая помощь приветствуется.


person Robert    schedule 09.07.2012    source источник


Ответы (1)


Вы держите свой массив в классе модели и позволяете другим классам «слушать» его, предоставляя этому классу объект SwingPropertyChangeSupport, а также метод addPropertyChangeListener(...). Затем дайте массиву метод setXXX(...) и в этом методе запустите объект SwingPropertyChangeSupport после обновления массива. На этом сайте есть примеры подобных вещей, некоторые написаны мной.

Например: здесь, здесь, здесь, ...

Кстати, я не удивлен, что ваш вызов makeTextPanel(text) не работает. Он создает JPanel, но вы ничего не делаете с JPanel, который возвращается из метода. Но и вы не должны. Я не думаю, что создание новых JPanels — это решение, которое вам нужно, а скорее обновление строк, отображаемых каким-либо компонентом, таким как JList или JTextArea, с использованием структуры прослушивателя, которую я описал выше.

Если что-то из этого непонятно, попросите разъяснений.

person Hovercraft Full Of Eels    schedule 09.07.2012
comment
Спасибо. Я попробую реализовать это. Я довольно бесполезен в этом, поэтому я, вероятно, возьму целую вечность и все равно испорчу это, но я дам вам знать. :-) - person Robert; 10.07.2012
comment
Спасибо. Это действительно заняло у меня целую вечность, и я действительно все испортил, но в конце концов я добился своего. - person Robert; 07.08.2012