0

私は2つのjframes.in 1 jframesを持っています.jtextareaに入力を与えていますが、それは別のjframe jtextarea.howに表示されます. 私はnetbeansを使用しており、swingを使用してjframeを設計しました。誰でも私を助けることができます。

4

3 に答える 3

2

2 つのテキスト コンポーネント間で同じ Document インスタンスを共有するだけです。 thisTextArea.setDocument(thatTextArea.getDocument())

于 2010-01-22T11:44:43.680 に答える
0

次のコードは、おそらく、これまで上にあった不可解な説明よりも優れていることを示しています:)

public class SourceFrame extends JFrame {

    private final JTextArea sourceArea = new JTextArea();
    private TargetFrame targetFrame; // somehow set this one

    public void addDocumentListener(DocumentListener listener) {
        sourceArea.getDocument().addDocumentListener(listener);
    }

    public void removeDocumentListener(DocumentListener listener) {
        sourceArea.getDocument().removeDocumentListener(listener);
    }

}

public class TargetFrame extends JFrame {

    private final JTextArea targetArea = new JTextArea();
    private final SourceFrame sourceFrame; 

    public void init() {
        sourceFrame.addDocumentListener(new DocumentListener() {
            public void changedUpdate(DocumentEvent event) {
                Document doc = event.getDocument();
                targetArea.setText(doc.getText(0, doc.getLength()));
            }
            public void insertUpdate(DocumentEvent event) {
                Document doc = event.getDocument();
                targetArea.setText(doc.getText(0, doc.getLength()));
            }
            public void removeUpdate(DocumentEvent event) {
                Document doc = event.getDocument();
                targetArea.setText(doc.getText(0, doc.getLength()));
            }
        }
    }

}

理想的には、TargetFrame にテキストを設定するパブリック メソッドを用意し、リスナーを別の場所に実装して、両方のフレームがもう一方を参照する必要がないようにすることです。

于 2010-01-22T08:07:41.770 に答える
0

これを行う適切な方法は、Observer パターン(リスナーとも呼ばれます) を使用することです。通常、2 つのメイン フレームは従属フレームを認識するべきではありません。関心のある人に通知する方法を提供する必要があります。コードでは:

public class SourceFrame extends JFrame {

    private final JTextArea sourceArea = new JTextArea();
    private TargetFrame targetFrame; // somehow set this one

    public void addTextChangeKeyListener(KeyListener listener) {
         sourceArea.addKeyListener(listener);
    }
    // a method to remove the listener might be required as well
}

次に、TargetFrameで、ソース テキスト領域で発生する主要なイベントをサブスクライブします。

public class TargetFrame extends JFrame {
    private final JTextArea targetArea = new JTextArea();
    private SourceFrame sourceFrame; // set this via constructor

    // this is called on initialization, perhaps from the constructor. 
    // Check what NetBeans has generated
    public void init() {
        sourceFrame.addDocumentListener(new DocumentListener() {
        public void changedUpdate(DocumentEvent event) {
            Document doc = event.getDocument();
            targetArea.setText(doc.getText(0, doc.getLength()));
        }
        public void insertUpdate(DocumentEvent event) {
            Document doc = event.getDocument();
            targetArea.setText(doc.getText(0, doc.getLength()));
        }
        public void removeUpdate(DocumentEvent event) {
            Document doc = event.getDocument();
            targetArea.setText(doc.getText(0, doc.getLength()));
        }
    }
}

e.getSource()、イベントを作成したコンポーネントを返します。

于 2010-01-22T08:24:29.993 に答える