1

これが私のコードの簡単なバージョンです:

JTextArea textareaA = new JTextArea(...);
JTextArea textareaB = new JTextArea(...);

textareaA.addModificationListener(new Modification Listener()
{
    public void modified(Modifiable arg0){
        if (textareaA.getValue().contains("\t"))
        {
           textareaA.setValue(textareaA.getValue().trim());
           textareaB.getTextComponent().requestFocusInWindow();
        }
    }
});

問題は、A の値を変更するさまざまな方法を試しても、B がフォーカスされないことです。A のフォーカス可能をオフにすると、オンに戻すことはできません。A からタブを削除してから B にフォーカスを移し、必要に応じてユーザーがクリックして A に戻れるようにする必要があります。タブは消えます。上記のコードを使用すると、B がリクエストしたにもかかわらず、フォーカスが A にとどまります。これはおそらくタイミングの問題ですか?

ありがとうございました!

4

1 に答える 1

2

私があなたの質問を理解している限り、ユーザーが「Tab」と入力して次のテキストエリアに切り替えられるようにしたいと考えています。また、最後に入力した「タブ」をトリムしたいとします。

テキストの途中で「タブ」を入力しても削除されないという事実に加えて、次のコード (独自のものに基づいて作成されたもの) は、あなたが望むことを行うようです:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Test {

    protected void initUI() {
        final JFrame frame = new JFrame();
        frame.setTitle("Test dialog synch");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new BorderLayout());
        final JTextArea textareaA = new JTextArea(24, 80);
        final JTextArea textareaB = new JTextArea(24, 80);
        textareaA.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
        textareaB.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
        textareaA.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void changedUpdate(DocumentEvent e) {
                modified();
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                modified();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                modified();
            }

            public void modified() {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        if (textareaA.getText().contains("\t")) {
                            textareaA.setText(textareaA.getText().trim());
                            textareaB.requestFocusInWindow();
                        }
                    }
                });
            }
        });
        panel.add(textareaA, BorderLayout.NORTH);
        panel.add(textareaB, BorderLayout.SOUTH);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().initUI();
            }
        });
    }

}
于 2012-05-31T20:51:45.430 に答える