2012-10-09 1 views
0

JInternalFrame의 제목 표시 줄 높이를 어떻게 알 수 있습니까? OS와 L & F 독립적 인 방식으로이 작업을 수행하는 것이 바람직합니다.JInternalFrame의 제목 표시 줄 높이를 가져 오는 방법은 무엇입니까?

나는이 SO question을 보았습니다. 비슷한 질문을하고있는 것 같지만, JDialog입니다.

는 컨테이너의 경계 크기를 표시하는 컨테이너의 인 세트의 값을 결정합니다 그러나, 대답은 Container 방법 getInsets()에 대한 javadoc 상태를 사용하는 것이 좋습니다 것 같다.

예를 들어 프레임 객체에는 프레임의 제목 표시 줄 높이에 해당하는 상단 인세 트가 있습니다.

불행하게도, JInternalFrameFrame하지만 JComponent 없습니다. 따라서 경계의 크기 만 제공합니다.

이전의 질문에서 유스 케이스가 무엇인지 묻습니다 ... 그래서 제 설명하겠습니다. JInternalFrame을 생성하고 마우스 클릭 시점에서 팝업되고 상위 프레임 내에서 마우스 클릭의 오른쪽 하단에 현재 표시된 공간보다 크지 않음을 포함하여 최대/최소 기준 크기로 크기를 조정하려고합니다.

는 다음 SSCCE 고려 : 당신이 이것을 실행하면 당신이 보는 바와 같이, 내부 팝업이 폭에 맞게 크기있다

/** 
* @author amaidment 
*/ 
public class JInternalFrameToy { 

    public static void main(String[] args) { 
    // create top-level frame 
    final JFrame frame = new JFrame("JInternalFrame Toy"); 
    frame.setPreferredSize(new Dimension(500, 500)); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // create desktop pane 
    final JDesktopPane pane = new JDesktopPane(); 

    // put button on the base of the desktop pane 
    JButton button = new JButton("Create Internal Frame"); 
    button.setSize(new Dimension(100,100)); 
    button.setVisible(true); 
    button.setLocation(0, 0); 
    button.setSelected(true); 
    pane.add(button); 
    frame.setContentPane(pane); 

    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     // create internal frame 
     JInternalFrame internal = new JInternalFrame("Internal Frame", 
      true, true, false, false); 
     JLabel label = new JLabel("Hello world!"); 

     // set size of internal frame 
     Dimension parentSize = pane.getParent().getSize(); 
     Insets insets = internal.getInsets(); 
     Point point = pane.getMousePosition(); 
     int width = parentSize.width - (insets.left+insets.right) - point.x; 
     int height = parentSize.height - (insets.top+insets.bottom) - point.y; 
     label.setPreferredSize(new Dimension(width, height)); 

     internal.setContentPane(label); 
     internal.setLocation(point); 
     internal.pack(); 
     internal.setVisible(true); 
     pane.add(internal); 
     internal.toFront(); 
     } 
    }); 

    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

있지만 높이 - 높이가 프레임 크기를 초과 즉 .. JInternalFrame의 제목 표시 줄 높이. 따라서이 높이를 알아 내서 JInternalFrame의 크기를 적절하게 설정할 수 있습니다.

답변

1

내가 지금까지 함께 온 가장 좋은 ...

Dimension parentSize = pane.getParent().getSize(); 
// get the initial preferred size - this has to be done before setContentPane() 
// the height should, I think, be the border + height of the title bar 
// the width is based on the title name, icon, etc. so is not useful 
Dimension initSize = internal.getPreferredSize(); 

// then get the insets, which can be used for the horizontal border 
Insets insets = internal.getInsets(); 

Point point = pane.getMousePosition(); 
int width = parentSize.width - (insets.left+insets.right) - point.x; 
int height = parentSize.height - initSize.height - point.y; 
label.setPreferredSize(new Dimension(width, height)); 

이이 일을하는 가장 좋은 방법은, 그래서 여전히 다른 답변 또는 제안 된 개선을 환영 확실하지 ...

1

당신은

((javax.swing.plaf.basic.BasicInternalFrameUI) getUI()).getNorthPane().getPreferredSize(); 
+0

같은 것이 OS & L & F 독립 될 것인가요 시도 할 수 있을까? – amaidment

+0

... 대부분 ... Nimbus에 대해서는 잘 모르겠지만 현재 L & F의 모든 곳에서는 기본으로 BasicInternalFrameUI를 사용합니다. 당신은 그걸 가지고 놀아야 만합니다. – MadProgrammer

+0

BasicInternalFrameUI의 코드를 보면 모든 레이아웃 코드가 여기에 있으며 제목 칸이 들어있는 북쪽 창에 액세스 할 수있는 유일한 곳입니다. Nimbus는 Synth 및 Synth 서브 클래스 Basic을 기반으로하므로 잘해야합니다. – Joshua