【问题标题】:Java - JTextArea - modifying after giving away focus?Java - JTextArea - 放弃焦点后修改?
【发布时间】:2012-05-31 19:36:56
【问题描述】:

这是我的代码的简单版本:

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,然后选项卡就消失了。上面的代码导致焦点停留在 A 中,即使我有 B 请求它。这可能是时间问题吗?

谢谢!

【问题讨论】:

  • 那么您真正需要的是在文本字段之间切换标签的能力?如果是这样,请参阅:stackoverflow.com/questions/2161714/…
  • 好的...这是什么addModificationListener?你有自己的监听器的 javax.swing.JTextArea 子类吗?
  • 是的,但它的工作原理与您预期的一样。
  • yes I do, but it works just as you would expect 但你必须创建自己的方法并覆盖if (textareaA.getValue().contains("\t"))
  • 如果您告诉我们您想要做什么,这将非常有帮助。我只能猜测: 1. 在您的表单中设置一个 Tab 顺序。 2. 编辑完成后修剪Textfield A中的值。除此之外,设置一个值不会改变焦点。

标签: java swing focus jtextarea timing


【解决方案1】:

据我了解您的问题,您希望用户能够键入“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();
            }
        });
    }

}

【讨论】:

  • +1 但搜索文档,否则可能会丢失偏见位置
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2014-11-05
  • 2010-10-06
  • 2012-11-29
相关资源
最近更新 更多