Java JInternalFrame激活/停用多次触发的事件
在我的应用程序中,我在JDesktopPane中添加了几个jinternalframe。JInternalFrame的激活和停用正常发生,直到其中一个JInternalFrame最大化。之后,以编程方式激活internalframe会多次触发internalFrameActivated和internalFrameDeactivated事件。为什么它被多次调用?我只在WindowsLookAndFeel中观察到了这一点Java JInternalFrame激活/停用多次触发的事件,java,windows,swing,look-and-feel,jinternalframe,Java,Windows,Swing,Look And Feel,Jinternalframe,在我的应用程序中,我在JDesktopPane中添加了几个jinternalframe。JInternalFrame的激活和停用正常发生,直到其中一个JInternalFrame最大化。之后,以编程方式激活internalframe会多次触发internalFrameActivated和internalFrameDeactivated事件。为什么它被多次调用?我只在WindowsLookAndFeel中观察到了这一点 public class IFTest { public static vo
public class IFTest {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(new WindowsLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame frame = new JFrame();
JDesktopPane pane = new JDesktopPane();
JInternalFrame if1 = new JInternalFrame("IF1");
JInternalFrame if2 = new JInternalFrame("IF2");
if1.setTitle("IF1");
if2.setTitle("IF2");
pane.add(if1);
pane.add(if2);
frame.getContentPane().add(pane);
frame.setSize(500, 500);
frame.setVisible(true);
if1.setMaximizable(true);
if1.setSize(400, 400);
showInternalFrame(if1);
if1.addInternalFrameListener(new MyInternalFrameListener("IF1"));
if2.setMaximizable(true);
if2.setSize(300, 300);
if2.setVisible(true);
showInternalFrame(if2);
if2.addInternalFrameListener(new MyInternalFrameListener("IF2"));
System.out.println("------------------------------");
try {
if1.setMaximum(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
System.out.println("--------------------------------");
showInternalFrame(if2);
}
static class MyInternalFrameListener extends InternalFrameAdapter {
String name;
public MyInternalFrameListener(String name) {
this.name = name;
}
@Override
public void internalFrameActivated(InternalFrameEvent e) {
System.out.println(name + " activated");
}
@Override
public void internalFrameIconified(InternalFrameEvent e) {
System.out.println(name + " iconfied");
}
@Override
public void internalFrameDeactivated(InternalFrameEvent e) {
System.out.println(name + " deactivated");
}
@Override
public void internalFrameDeiconified(InternalFrameEvent e) {
System.out.println(name + " deiconfied");
}
}
public static void showInternalFrame(JInternalFrame intf) {
try {
if (intf.isIcon())
intf.setIcon(false);
intf.setVisible(true);
intf.moveToFront();
intf.setSelected(true);
} catch (PropertyVetoException ex) {
ex.printStackTrace();
}
}
}
为什么它被多次调用
我猜它不喜欢一次最大化多个帧。在普通GUI中,您必须先恢复当前最大化的帧,然后才能单击另一个帧来最大化它
您的代码是:
if1.setMaximum(true);
showInternalFrame(if2);
我注意到,在执行了这段代码之后,if2被最大化了,即使您没有明确要求它被最大化。所以我猜,在选择帧的代码中的某个地方,它意识到当前帧被最大化了,所以有一堆代码正在执行,这些代码会在几分钟内恢复/停用帧,直到if1被恢复,if2被选择并最大化。很明显,代码在执行此操作时生成了一系列事件
另一方面,如果您有如下代码:
if1.setMaximum(true);
if1.setMaximum(false);
showInternalFrame(if2);
然后你得到了预期的事件
因此,作为问题的解决方案,您可以在showInternalFrame方法中添加如下代码:
JinternalFrame active = intf.getDesktopPane().getSelectedFrame();
if (active.isMaximized())
active.setMaximum(false);
ints.setSelected(true);
也许你是对的,为了更好的帮助,请尽快发布一个简短、可运行、可编译的SSCCEm,以避免对JInternalFrames事件的猜测windows下桌面管理器实现的一些有趣的行为。我们偷了默认的桌面管理器,并将其替换为windows外观和feel@MadProgrammer请告诉我这是对OP与否的回答:-@mKorbel我手头没有代码,所以我不能是100%,但在最大化窗口的情况下有一些非常奇怪的行为:P@MadProgrammer谢谢你的确认