2015-01-12 55 views
0

在我的java swing應用程序中,每當我點擊窗體的某個字段時,我想顯示一個信息文本(屏幕頂部的JTextArea)。要做到這一點,我實現了接口的PropertyChangeListener 如下:如何防止組件的可聚焦性java swing

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

你不能嘗試在發起事件的組件上使用'requestFocus()'嗎?看看它是否有幫助。 – Iootu

+0

我剛寫了一個測試程序,我沒有看到你描述的行爲。在JTextArea上調用setText並沒有給它關注。它導致JTextArea滾動到底部,而不是頂部。您的JTextArea是否在JScrollPane中? – VGR

回答

0

刪除

infoAreaPane.setVisible(focusHint != null); 
+0

我試過這個解決方案,但infoArea仍然獲得焦點:( –

0

如果你不希望組件獲得焦點,您可以使用:

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

但滾動條不斷返回屏幕頂部

請勿使用setText()。您可以直接更新Document。可能是這樣的:

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

謝謝你的回答@camickr,但它不起作用。我還試圖保存滾動位置,設置文本,然後放回位置,工作 –

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); 
        } 
       }); 
     } 
    } 
}