gpt4 book ai didi

java - 如何获取 JInternalFrame 标题栏的高度?

转载 作者:行者123 更新时间:2023-12-02 07:31:50 25 4
gpt4 key购买 nike

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

我看过这个SO question ,这似乎在问类似的问题,但针对的是 JDialog。但是,答案似乎建议使用 Container 方法 getInsets(),其中 javadoc状态:

Determines the insets of this container, which indicate the size of the container's border.

A Frame object, for example, has a top inset that corresponds to the height of the frame's title bar.

不幸的是,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 的大小。

最佳答案

迄今为止我想出的最好的......

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

不确定这是否是最好的方法,因此仍然欢迎替代答案或建议的改进...

关于java - 如何获取 JInternalFrame 标题栏的高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12803963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com