2012-10-09 41 views
0

如何找出JInternalFrame標題欄的高度? 這將是最好的在一個操作系統和獨立的方式L &。我如何獲得JInternalFrame標題欄的高度?

我看到這個SO question,這似乎是問一個類似的問題,但爲JDialog。然而,答案似乎使用Container方法getInsets(),爲此javadoc狀態表明:

確定此容器的insets,它指示容器邊框的大小。

例如,一個框架對象有一個與框架標題欄的高度對應的頂部插入。

不幸的是,JInternalFrame不是Frame,而是JComponent。因此,這隻能提供邊界的大小。

在之前的SO問題中,有人問及用例是什麼......所以讓我解釋一下我的問題。我想創建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