1

아래의 SSCCE에서 JInternalFrame 중 하나를 최대화하면 둘 다 최대화되는 것을 볼 수 있습니다. 이 AFAIK (AFAIK)은 "Windows"LookAndFeel과 함께 발생합니다 (LookAndFeel 코드를 생략하면 예상대로 작동 함). JInternalFrame 최대화 Windows Look & Feel로 모든 JInternalFrame 최대화

재현하려면

  1. 실행에게 SSCCE를 아래.
  2. JInternalFrame 중 하나를 최대화하십시오.
  3. 닫기 (X) 최대화 한 사용자
  4. 다른 하나는 최대화되었습니다.

이 동작을 중지시키는 방법이 있습니까? 이거 버그 야?

SSCCE : 당신은 하나 개의 프레임을 최대화 할 때 모든 프레임을 극대화 (내 의견 버그 더 ...) 기능이있어 윈도우가 DesktopManager에서

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 

class Test2 { 
    public static void main(String[] args) { 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Windows".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException e) { 
      e.printStackTrace(); 
     } 
     JFrame frame = new JFrame(); 
     JDesktopPane jdp = new JDesktopPane(); 
     jdp.setBackground(Color.gray); 
     frame.add(jdp); 
     jdp.setVisible(true); 
     frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH); 
     frame.setVisible(true); 

     JInternalFrame jiffy1 = new JInternalFrame("Jiffy1", true, true, true, true); 
     jdp.add(jiffy1); 
     JLabel jiffy1_label = new JLabel("Jiffy1"); 
     jiffy1_label.setHorizontalAlignment(SwingConstants.CENTER); 
     jiffy1_label.setFont(new Font("Tahoma", 0, 50)); 
     jiffy1.add(jiffy1_label); 
     jiffy1.setPreferredSize(new Dimension(300,300)); 
     jiffy1.setVisible(true); 
     jiffy1.pack(); 
     centerJIF(jdp, jiffy1); 

     JInternalFrame jiffy2 = new JInternalFrame("Jiffy2", true, true, true, true); 
     jdp.add(jiffy2); 
     JLabel jiffy2_label = new JLabel("Jiffy2"); 
     jiffy2_label.setHorizontalAlignment(SwingConstants.CENTER); 
     jiffy2_label.setFont(new Font("Tahoma", 0, 50)); 
     jiffy2.add(jiffy2_label); 
     jiffy2.setPreferredSize(new Dimension(200,200)); 
     jiffy2.setVisible(true); 
     jiffy2.pack(); 
     centerJIF(jdp, jiffy2); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    private static void centerJIF(JDesktopPane jdp, JInternalFrame jiffy) { 
     Dimension desktopSize = jdp.getSize(); 
     Dimension VInternalFrameSize = jiffy.getSize(); 
     int width = (desktopSize.width - VInternalFrameSize.width)/2; 
     int height = (desktopSize.height - VInternalFrameSize.height)/2; 
     jiffy.setLocation(width, height); 
    } 
} 
+0

을 예 , 이것은 문제가되는 위트입니다. h Windows의 모양과 느낌'DesktopManager' – MadProgrammer

+0

@MadProgrammer * "이것은 Windows의 모양과 느낌에 문제가 있습니다."* It it? 내 말은, 다른 내부 프레임 기반 Windows 응용 프로그램을 사용한다는 것입니다. 똑같은 일을합니까 (1)? 그렇다면 단순히 Look & Feel을 준수하는 것과는 대조적으로 '문제'처럼 느껴지지 않습니다. 1) 그것은 수사학적인 질문이 아니며, 나는 정말로 그 답을 모른다. –

+0

@AndrewThompson 이것은 실제로 설계된 방식 일 수 있습니다 (미안하지만 왜 우리가 그것을 버렸는지 알아 내려고 노력했습니다). 우리는 금속 모양과 느낌을 Windows로 바꾸고이 문제를 발견했습니다. 따라서 다른 모양과 느낌이 다르게 적용됩니다. Windows 표준입니다 ... 흠, MDI가 Windows 3.1에서 가치가 떨어졌는지 모르겠습니다. 우리는'DefaultDesktopManager'를 사용하여, 우리가 수정했는지 여부를 기억하지 못합니다. ... – MadProgrammer

답변

2

.

  if (currentFrame.isMaximum() && 
     (f.getClientProperty("JInternalFrame.frameType") != 
     "optionDialog")) { 
       //Special case. If key binding was used to select next 
       //frame instead of minimizing the icon via the minimize 
       //icon. 
       if (!currentFrame.isIcon()) { 
        currentFrame.setMaximum(false); 
        if (f.isMaximizable()) { 
         if (!f.isMaximum()) { 
          f.setMaximum(true); 
         } else if (f.isMaximum() && f.isIcon()) { 
          f.setIcon(false); 
         } else { 
          f.setMaximum(false); 
         } 
        } 
       } 
      } 
      if (currentFrame.isSelected()) { 
       currentFrame.setSelected(false); 
      } 
     } 

     if (!f.isSelected()) { 
      f.setSelected(true); 
     } 
    } catch (PropertyVetoException e) {} 
    if (f != currentFrame) { 
     currentFrameRef = new WeakReference(f); 
    } 
} 
... 

62

... 
public void activateFrame(JInternalFrame f) { 
    JInternalFrame currentFrame = currentFrameRef != null ? 
     currentFrameRef.get() : null; 
    try { 
     super.activateFrame(f); 
     if (currentFrame != null && f != currentFrame) { 
  // If the current frame is maximized, transfer that 
      // attribute to the frame being activated. 
그래서 대신 WindowsDesktopManager의 DefaultDesktopManager을 다시 설치하고 문제를 해결할 수있는 줄에서 WindowsDesktopManager.java에서

(자바 7) :

JDesktopPane jdp = new JDesktopPane(); 
jdp.setDesktopManager(new DefaultDesktopManager()); 
+1

와우 그 트릭을 했어! 감사! – ryvantage