在我的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)方法,但滚动条一直返回到屏幕顶部。
如果需要进一步的信息,请告诉我。
谢谢
答案 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);
}
});
}
}
}