如何防止组件聚焦java swing

时间:2015-01-12 14:58:56

标签: java swing focus jtextarea propertychangelistener

在我的java swing应用程序中,每当我点击表单的一个字段时,我想显示一个信息文本(屏幕顶部的JTextArea)。为此,我实现了接口PropertyChangeListener 如下:

private final class FocusChangeHandler implements PropertyChangeListener {
    @Override
    public void propertyChange(final PropertyChangeEvent evt) {
        final String propertyName = evt.getPropertyName();
        if (!"permanentFocusOwner".equals(propertyName)) {
            return;
        }

        final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();

        final String focusHint = (focusOwner instanceof JComponent) ? ((String) ValidationComponentUtils.getInputHint((JComponent) focusOwner))
                : null;

        infoArea.setText(focusHint);
        infoAreaPane.setVisible(focusHint != null);
    }
}

我的问题是,只要infoArea的值发生变化,它就会获得焦点并且滚动条会返回到顶部。

我想阻止这种行为,我想更新infoArea的值而不关注它。

我尝试了.setFocusable(false)方法,但滚动条一直返回到屏幕顶部。

如果需要进一步的信息,请告诉我。

谢谢

3 个答案:

答案 0 :(得分:0)

删除

infoAreaPane.setVisible(focusHint != null);

答案 1 :(得分:0)

如果您不希望组件获得焦点,可以使用:

JTextArea textArea = new JTextArea(...);
textArea.setFocusable( false );
  

但滚动条会一直返回到屏幕顶部

请勿使用setText()

相反,您可以尝试直接更新Document。也许是这样的:

Document doc = textArea.getDocument()
doc.remove(...);
doc.insertString(...);

答案 2 :(得分:0)

我发现了这个问题的黑客攻击。

private final class FocusChangeHandler implements PropertyChangeListener {
    @Override
    public void propertyChange(final PropertyChangeEvent evt) {
        final String propertyName = evt.getPropertyName();
        if (!"permanentFocusOwner".equals(propertyName)) {
            return;
        }

        final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();

        final String focusHint = (focusOwner instanceof JComponent) ? ((String) ValidationComponentUtils.getInputHint((JComponent) focusOwner))
                : null;
        final int scrollBarPosition = panelScrollPane.getVerticalScrollBar().getValue();
        infoAreaPane.setVisible(focusHint != null);
        infoArea.setText(infoHint);
        if(focusHint != null) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                   public void run() { 
                       panelScrollPane.getVerticalScrollBar().setValue(scrollBarPosition);
                   }
                });
        }
    }
}