3 回答
TA貢獻1829條經驗 獲得超6個贊
可能的解決方案是:
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myFrame.toFront();
myFrame.repaint();
}});TA貢獻1815條經驗 獲得超6個贊
Windows具有防止窗口竊取焦點的功能; 相反,它會閃爍任務欄圖標。在XP中它默認是打開的(我看到改變它的唯一地方是使用TweakUI,但在某處有一個注冊表設置)。在Vista中,他們可能已經更改了默認值和/或將其作為用戶可訪問的設置暴露在開箱即用的UI中。
從Windows 2K開始,防止窗戶強迫自己到前方并獲得焦點是一個特征(而且我,我很感激它)。
也就是說,我有一個小的Java應用程序,用來提醒我在工作時記錄我的活動,它每30分鐘就會成為活動窗口(當然可以配置)。它始終在Windows XP下始終如一,并且永遠不會閃爍標題欄窗口。它使用以下代碼,作為計時器事件觸發的結果在UI線程中調用:
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }toFront();repaint();(如果最小化,第一行恢復......實際上如果最大化也會恢復它,但我從來沒有這樣做)。
雖然我通常將這個應用程序最小化,但通常它只是在我的文本編輯器后面。并且,就像我說的,它總是有效的。
我確實知道你的問題可能是什么 - 也許你有一個setVisible()調用的競爭條件。除非在調用窗口時實際顯示窗口,否則toFront()可能無效; 我之前遇到過requestFocus()這個問題。您可能需要在窗口激活事件的UI偵聽器中放置toFront()調用。
2014-09-07:在某個時間點上面的代碼停止工作,也許是在Java 6或7中。經過一些調查和實驗,我不得不更新代碼以覆蓋窗口的toFront方法做到這一點(結合修改后的代碼來自什么在上面):
setVisible(true);toFront();requestFocus();repaint();...public @Override void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);}從Java 8_20開始,這段代碼似乎運行正常。
添加回答
舉報
