1

我遇到了更多“我对编程毫无希望”的问题。

我有一段代码,它使用 StringBuilder 在程序启动时在 GUI 的文本面板中显示数组元素。这是 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;
}

GUI 也有一个文本输入面板,可以在其中输入十六进制值的字符串。

单击按钮时,系统会提示用户输入另一个值,该值对应于数组中应插入第一个十六进制值的位置。

输入这些值后,我希望更新/刷新显示以反映这一点,但不确定如何去做。

我在这里找到了这个问题,这是相似的,但我不确定实现观察者/可观察模式是否是正确的方法,即使是,我将如何去做: Best Way to Constantly Update GUI Elements

我最初的方法是添加一个“updateDisplay()”方法,我可以在处理按钮单击后调用它并重新调用 makeTextPanel 方法:

public void updateDisplay() {

    makeTextPanel(text);
}

我认为这可能会刷新它,但它对显示没有影响。

任何帮助表示赞赏。

4

1 回答 1

1

您将数组保存在模型类中,并允许其他类通过为此类提供 SwingPropertyChangeSupport 对象以及 addPropertyChangeListener(...) 方法来“监听”它。然后给数组一个 setXXX(...) 方法,并在更新数组后在该方法中触发 SwingPropertyChangeSupport 对象。这个网站上有这类事情的例子,有些是我写的。

例如:这里这里这里,...

顺便说一句,我对你的电话makeTextPanel(text)不起作用并不感到惊讶。它创建了一个 JPanel,但您似乎没有对该方法返回的 JPanel 执行任何操作。但你也不应该。我不认为创建新的 JPanel 是您想要的解决方案,而是使用我上面描述的侦听器框架更新由某种组件(例如 JList 或 JTextArea)显示的字符串。

如果其中任何一个令人困惑,请要求澄清。

于 2012-07-09T17:01:37.040 回答