내 응용 프로그램에서 JDesktopPane에서 JInternalFrames를 거의 추가하지 않았습니다. JInternalFrame의 활성화 및 비활성화는 JInternalFrame 중 하나가 최대화 될 때까지 정상적으로 발생합니다. 그런 다음 내부 프레임을 프로그래밍 방식으로 활성화하면 internalFrameActivated, internalFrameDeactivated 이벤트가 여러 번 발생합니다. 왜 그것이 여러 번 불려지 는가? 이것은 나는 그것이 여러 번이라고 왜에만JInternalFrame 여러 번 발생 된 이벤트 활성화/비활성화
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();
}
}
}
어쩌면 당신은 더 나은 도움을 맞아, JInternalFrames 이벤트에 대한 추측을 피하십시오. – mKorbel
Windows에서 데스크탑 관리자 구현의 흥미로운 동작이 있습니다. 우리는 기본 바탕 화면 관리자를 훔쳐서 창 모양과 느낌으로 바 꾸었습니다 – MadProgrammer
@MadProgrammer 이것은 OP에 대한 답변입니다 :-) – mKorbel