0

如何找出 a 的标题栏的高度JInternalFrame?最好以独立于操作系统和 L&F 的方式执行此操作。

我见过这个SO question,它似乎在问一个类似的问题,但对于JDialog. 但是,答案似乎建议使用Container方法getInsets()javadoc指出:

确定此容器的 insets,指示容器边框的大小。

例如,一个 Frame 对象的顶部插图对应于框架标题栏的高度。

不幸的是,JInternalFrame不是一个Frame,而是一个JComponent。因此,这仅提供边框的大小。

在上一个 SO 问题中,有人问用例是什么......所以让我解释一下我的。我想创建JInternalFrames,在鼠标点击时弹出,并调整到一些最大/最小标准,包括它不大于父框架内鼠标点击右下角的当前可见空间。

考虑以下 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适当地设置大小。

4

3 回答 3

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));

不确定这是否是最好的方法,所以仍然欢迎其他答案或建议的改进......

于 2012-10-09T16:40:53.390 回答
1

你可以尝试类似的东西

( (javax.swing.plaf.basic.BasicInternalFrameUI) getUI()).getNorthPane().getPreferredSize();
于 2012-10-09T19:18:42.527 回答
-1

你能调用那个特定 JComponent 的 getHeight() 吗?见文档

于 2012-10-09T16:31:29.287 回答