我是Swing開發的新手,希望我的問題不是愚蠢的。焦點所有者臨時更改爲空
我遇到了以下問題。我正在使用KeyboardFocusManager
跟蹤焦點,聽取屬性permanentFocusOwner
的變化。但是,當焦點從一個控件更改爲另一個控件時,我得到permanentFocusOwner
屬性的中間更改爲null
。
當焦點位於其中一個面板或其子面板內時,我當前的UI邏輯正在對控件進行一些更改。然而,獲取中間null
打破了這種邏輯。
我在谷歌搜索了關於這個問題的信息,沒有找到任何相關的。
問題是,這種行爲是否由設計決定,以及是否有某種方法可以解決中間空值問題。
這裏是最小的應用再現的所述行爲:
import java.awt.*;
import java.beans.*;
import javax.swing.*;
public class FocusNullTest extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
FocusNullTest self = new FocusNullTest();
self.setVisible(true);
}
});
}
public FocusNullTest() {
setSize(150, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
contentPane.add(new JButton("1"));
contentPane.add(new JButton("2"));
KeyboardFocusManager focusManager =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.addPropertyChangeListener(
"permanentFocusOwner",
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
System.out.println("permanentFocusOwner changed from: "
+ e.getOldValue());
System.out.println("permanentFocusOwner changed to : "
+ e.getNewValue());
}
});
}
}
日誌輸出是:
(程序啓動,重點集來按鈕1自動地)
permanentFocusOwner從改變:null
permanentFocusOwner更改爲:javax.swing.JButton [,0,18,41x26,(跳過)]
(點擊按鈕2)
permanentFocusOwner由:javax.swing.JButton中[,0,18,41x26,(跳過)]
permanentFocusOwner更改爲:空
permanentFocusOwner由:空
permanentFocusOwner變更爲:javax.swing.JButton中[,41,18,41x26,(跳過)]
(可選部分地基於所述代碼意圖)
我的目標是使東西看起來像一個列表視圖,其中的條目展開並顯示更多的信息,當他們獲得焦點(並在失去時折回)。展開的視圖包含一些額外的按鈕。
JList
似乎不是合適的控件,因爲(1)它不允許點擊按鈕,(2)它的條目具有恆定的高度,而我希望條目在焦點上動態擴展。編輯模式JTable
似乎也不是一個合適的解決方案,至少因爲不斷的條目大小。
所以我使用普通的JPanel
和一個垂直框佈局作爲容器,並訂閱模型更改並手動更新視覺效果。問題是,當我點擊一個按鈕時,包含列表項失去焦點。如果焦點暫時不會變爲null
,我可以檢測到焦點仍在列表項內。
+ 1 for [sscce](http://sscce.org/),但有關目標的更多詳細信息可能會提供更好的解決方案。 – trashgod
@trashgod:添加了一些關於代碼意圖的細節 – Vlad