2013-10-08 2 views
0

В моем приложении на JDesktopPane я добавил несколько JInternalFrames. Активация и деактивация JInternalFrames происходит нормально, пока один из JInternalFrame не будет максимизирован. После этого, активизируя внутреннюю структуру программным способом, срабатывает internalFrameActivated, internalFrameDeactivated события несколько раз. Почему это называется много раз? Это я наблюдал в WindowsLookAndFeel только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

может быть, вы правы, для лучшей помощи рано опубликовать SSCCEm коротких, работоспособные, компилируемый в избегая спекуляций о событиях JInternalFrames – mKorbel

+0

Есть некоторые, интересные, поведение реализации диспетчера рабочего стола под окнами. Мы украли менеджер рабочего стола по умолчанию и заменили его под видом окна – MadProgrammer

+0

@MadProgrammer, пожалуйста, это ответ OP или нет :-) – mKorbel

ответ

0

Почему это называется много раз?

Я бы предположил, что он не хотел бы иметь несколько кадров, максимизированных за один раз. В обычном графическом интерфейсе вам нужно будет восстановить максимально развернутый кадр, прежде чем вы сможете щелкнуть по другому кадру, чтобы максимизировать его.

Ваш код:

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

Я заметил, что после выполнения этого кода, if2 максимизируется, даже если вы не явно просить, чтобы он был максимальным. Поэтому я предполагаю, что где-то в коде, чтобы выбрать фрейм, он понимает, что текущий кадр максимизирован, так что есть куча кода, который выполняется, который восстанавливает/деактивирует кадры пару раз, пока не будет восстановлен if1, и если выбрано 2 и максимально. Очевидно, что код генерирует кучу событий, как он это делает.

С другой стороны, если у вас есть такой код:

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

тогда вы получите события, как и ожидалось.

Так, может быть, как решение вашей проблемы вы можете добавить код, как следующее в вашем showInternalFrame метода():

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

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

ints.setSelected(true); 
Смежные вопросы