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 には、16 進値の文字列を入力できるテキスト入力パネルもあります。

ボタンをクリックすると、ユーザーは別の値の入力を求められます。この値は、最初の 16 進数値を挿入する配列内の位置に対応します。

これらの値が入力されたら、これを反映するように表示を更新/更新したいのですが、どうすればよいかわかりません。

ここでこの質問を見つけました。これは似ていますが、Observer/Observable パターンを実装することが正しい方法であるかどうかはわかりません。また、正しい場合でも、どうすればよいかわかりません: GUI 要素を常に更新するための最良の方法

私の最初のアプローチは、「updateDisplay()」メソッドを追加することでした。これは、ボタンのクリックを処理した後に呼び出すことができ、makeTextPanel メソッドを再度呼び出すことができます。

public void updateDisplay() {

    makeTextPanel(text);
}

これでリフレッシュできるかと思いましたが、表示には影響しません。

どんな助けでも感謝します。

4

1 に答える 1

1

配列をモデル クラスに保持し、このクラスに SwingPropertyChangeSupport オブジェクトと addPropertyChangeListener(...) メソッドを与えることで、他のクラスがこれを「リッスン」できるようにします。次に、配列に setXXX(...) メソッドを指定し、そのメソッドで、配列を更新した後に SwingPropertyChangeSupport オブジェクトを起動します。このサイトにはまさにこの種の例があり、いくつかは私が書いたものです。

例:ここここここ、 ...

ところで、あなたの への呼び出しが機能しないことには驚きmakeTextPanel(text)ません。JPanel を作成しますが、メソッドから返された JPanel で何もしていないようです。しかし、そうすべきではありません。新しい JPanels を作成することが解決策だとは思いませんが、上記で説明したリスナー フレームワークを使用して、JList や JTextArea などのコンポーネントによって表示される文字列を更新することをお勧めします。

このいずれかがわかりにくい場合は、説明を求めてください。

于 2012-07-09T17:01:37.040 に答える