4

Editor クラス (JTextPane を使用) と Toolbar クラス (JList と Jbutton を使用、JToolBar を使用したくない) を持つメイン クラスがあります。これら 2 つのクラスは多くのコンポーネントで構成されているため、これらを同じクラスに混在させたくありません。エディターとツールバーが通信できるようにしたい。ツールバーに「こんにちは」と書いて、[送信] をクリックするとします。テキスト ウィンドウに "Hello" と表示させたい。私はこのようにクラスを構築します:

public class Main{
    public MainGUI(){
        initComponents();
    }

    private void initComponents(){
        JFrame mainframe=new JFrame("Main Frame");
        Editor editor=new Editor();
        Toolbar toolbar=new Toolbar();
        mainframe.getContentPane().setLayout(new BorderLayout());
        mainframe.getContentPane().add(editor, BorderLayout.CENTER);
        mainframe.getContentPane().add(toolbar, BorderLayout.NORTH);
        mainframe.setVisible(true);
    }
}

public class Editor extends JPanel{
    public Editor(){
        super();
        initComponents();
    }

    private void initComponents(){
        JTextPane textpane=new JTextPane();

        this.setLayout(new BorderLayout());
        this.add(textpane, BorderLayout.CENTER);
    }
}

public class Toolbar extends JPanel{
    public Toolbar(){
        super();
        initComponents();
    }

    private void initComponents(){
        JTextField textfield=new JTextField();
        JButton submitbutton=new JButton("Submit");

        this.setLayout(newFlowLayout());
        this.add(textfield);
        this.add(submitbutton);
    }
}

ツールバーとエディターの間のイベント処理をどのように実装すればよいですか?

4

2 に答える 2

9

インターフェイスを作成できますValueSubmittedListener

interface ValueSubmittedListener {
    public void onSubmitted(String value);
}

そしてそれをEditor実装しています。

class Editor implements ValueSubmittedListener{

    ...

    public void onSubmitted(String value) {
        // add text to JTextPane.
    }
}

次にToolbar、メソッドを提供します

class Toolbar {

    private List<ValueSubmittedListener> listeners = new ArrayList<ValueSubmittedListener>();


    public void addListener(ValueSubmittedListener listener) {
        listeners.add(listener);
    }

    private void notifyListeners() {
        for (ValueSubmittedListener listener : listeners) {
            listener.onSubmitted(textfield.getText());
        }
    }

}

次に、新しい値をエディターに送信する必要があるたびに (つまり、 insubmitButtonActionListener)、メソッドを呼び出すだけnotifyListenersです。

アップデート:

initComponentsofMainで に登録Editorする必要があることを忘れていましたToolbar:

private void initComponents() {
   JFrame mainframe = new JFrame("Main Frame");
   Editor editor = new Editor();
   Toolbar toolbar = new Toolbar();
   toolbar.addListener(editor); // register listener
   ...
}
于 2012-08-19T15:59:21.023 に答える
2

重要な原則は、各オブジェクトが必要なオブジェクトにアクセスできるように、必要に応じて参照を渡すことです。

たとえば、「送信」が (ツールバーにある) テキスト フィールド内のテキストをエディターのテキスト ペインに追加することを意味する場合、次のようにすることができます。

public class Main{
    public MainGUI(){
        initComponents();
    }

    private void initComponents(){
        JFrame mainframe=new JFrame("Main Frame");
        Editor editor=new Editor();
        Toolbar toolbar=new Toolbar(editor);
        mainframe.getContentPane().setLayout(new BorderLayout());
        mainframe.getContentPane().add(editor, BorderLayout.CENTER);
        mainframe.getContentPane().add(toolbar, BorderLayout.NORTH);
        mainframe.setVisible(true);
    }
}

private final JTextPane textpane=new JTextPane();
public class Editor extends JPanel{
    public Editor(){
        super();
        initComponents();
    }

    private void initComponents(){
        this.setLayout(new BorderLayout());
        this.add(textpane, BorderLayout.CENTER);
    }

    public void appendText(final String text) {
        this.textpane.setText( this.textpane.getText()+text );
    }
}

public class Toolbar extends JPanel{
    private final Editor editor;
    public Toolbar(final Editor editor){
        super();
        this.editor = editor;
        initComponents();
    }

    private void initComponents(){
        final JTextField textfield=new JTextField();
        JButton submitbutton=new JButton("Submit");
        submitbutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent event) {
                editor.appendText( textfield.getText() );
            }
            });

        this.setLayout(newFlowLayout());
        this.add(textfield);
        this.add(submitbutton);
    }
}
于 2012-08-19T16:07:25.847 に答える