2013-10-08 1 views
0

내 응용 프로그램에서 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(); 
    } 
} 
} 
+1

어쩌면 당신은 더 나은 도움을 맞아, JInternalFrames 이벤트에 대한 추측을 피하십시오. – mKorbel

+0

Windows에서 데스크탑 관리자 구현의 흥미로운 동작이 있습니다. 우리는 기본 바탕 화면 관리자를 훔쳐서 창 모양과 느낌으로 바 꾸었습니다 – MadProgrammer

+0

@MadProgrammer 이것은 OP에 대한 답변입니다 :-) – mKorbel

답변

0

WindowsLookAndFeel에서 관찰 한?

한 번에 최대화 된 프레임이 여러 개있는 것을 원하지 않는다고 생각합니다. 일반 GUI에서는 최대화 된 다른 프레임을 클릭하기 전에 현재 최대화 된 프레임을 복원해야합니다.

귀하의 코드는 다음과 같습니다

if1.setMaximum(true); 
showInternalFrame(if2); 

는이 코드를 실행 한 후, IF2는이 극대화 할 수 있도록 명시 적으로 요청하지 않은 경우에도 극대화 것으로 나타났습니다. 따라서 코드에서 어딘가에 현재 프레임이 최대화되어 있음을 알게되면 if1이 복원되고 if2가 선택 될 때까지 프레임을 몇 번 복원/비활성화합니다 최대화. 이 코드는 분명히 수많은 이벤트를 생성합니다. 한편

당신이 좋아하는 코드가있는 경우 :

if1.setMaximum(true); 
if1.setMaximum(false); 
showInternalFrame(if2); 

은 다음 이벤트를 얻을 것으로 예상한다.

그래서 어쩌면 당신의 문제에 대한 해결책은 당신이() 메소드 당신의 showInternalFrame에 다음과 같은 코드를 추가 할 수 있습니다 같이 빨리에 SSCCEm, 짧은 실행 가능한 컴파일 가능한 게시

JinternalFrame active = intf.getDesktopPane().getSelectedFrame(); 

if (active.isMaximized()) 
    active.setMaximum(false); 

ints.setSelected(true); 
관련 문제