我有一个带有很多窗口的应用程序,并且遇到了与您类似的问题。我的解决方法是:
@Override
public void windowActivated(WindowEvent e) {
if (e.getOppositeWindow() == null) {
//front every window
}
}
首先,我创建了一个类“SlveFrame”(Slve 是我的应用程序的名称),它是“JFrame”的一个子类。
public class SlveFrame extends JFrame implements WindowListener {
static ArrayList<SlveFrame> frames = new ArrayList<SlveFrame>();
public SlveFrame () {
addWindowListener(this); / /to make JFrame fire WindowListener's method
}
/ /... every method added from WindowListener
@Override
public void windowActivated(WindowEvent e) {
if (e.getOppositeWindow() == null) { // return null if window is not from my (or Your) work
for (SlveFrame frame : frames) { // if you have no idea what this is, look for "for each loop java" in google
frame.toFront();
}
}
}
/**
* The use of SlveFrame is almost the same as Jframe
*/
@Override
public void setVisible (boolean b) {
if (b)
frames.add(this);
else
frames.remove(this); // may raise an exception if you're not careful
super.setVisible(b); // or your window will simply not be visible.
}
@Override
public void dispose () {
frames.dispose(this) // may raise an exception you'll want to handle
}
}
诀窍是如果 JFrame(或子类)来自您自己的程序,则
WindowEvent.getOppositeWIndow() 返回一个Jframe ,这意味着如果您切换到另一个程序或应用程序(例如 eclipse、Firefox 或文本编辑器)然后返回您的任何窗口,然后调用getOppositeWindow()将返回“null”。一个简单的if (e.getOppositeWindow())
方法可以很容易地确定您的窗口是否在需要您将每个窗口都放在前面的条件下获得焦点,或者更确切地说是让一切都在。
setVisible (boolean b)
和的覆盖 dispose ()
是可选的,但允许开发人员将其用作常规窗口。
我希望我能有所帮助。真诚的~喇嘛