Java 获取JDialog标题栏的高度?

Java 获取JDialog标题栏的高度?,java,swing,jdialog,Java,Swing,Jdialog,如何获取标题栏的高度 我尝试了使用getInsets().top,但它返回0请尝试一下: Container c = this.getContentPane(); Point pt = c.getLocation(); pt = SwingUtilities.convertPoint(c, pt, this); pt变量现在保存内容窗格相对于JDialog原点的位置。因此,pt.x是距离左边缘的距离,pt.y是距离顶部的距离 注意事项: 这假设没有JMenuBar。如果有,请使用JMenuB

如何获取标题栏的高度

我尝试了使用
getInsets().top
,但它返回
0

请尝试一下:

Container c = this.getContentPane();
Point pt = c.getLocation();
pt = SwingUtilities.convertPoint(c, pt, this);
pt
变量现在保存内容窗格相对于JDialog原点的位置。因此,
pt.x
是距离左边缘的距离,
pt.y
是距离顶部的距离

注意事项:

  • 这假设没有JMenuBar。如果有,请使用JMenuBar的位置
  • 这将包括添加到contentPane或LayerPane的任何边框。你需要把它们减去
试试看:

Container c = this.getContentPane();
Point pt = c.getLocation();
pt = SwingUtilities.convertPoint(c, pt, this);
pt
变量现在保存内容窗格相对于JDialog原点的位置。因此,
pt.x
是距离左边缘的距离,
pt.y
是距离顶部的距离

注意事项:

  • 这假设没有JMenuBar。如果有,请使用JMenuBar的位置
  • 这将包括添加到contentPane或LayerPane的任何边框。你需要把它们减去

我不知道,如果您使用的是操作系统自己的窗口管理器,这可能不可能。原因是,标题栏是在Java之外绘制的。如果您真的需要这些信息,您可能需要使用JNI

但是,如果使用的是内部框架,则可以执行以下操作

JInternalFrame mydialog = new JInternalFrame();
((BasicInternalFrameUI)mydialog.getUI()).getNorthPane().getHeight();
但更重要的问题是,你为什么想知道?窗口系统的思想是,程序员可以从窗口环境中抽象出应用程序的内容。这样,用户可以动态定制窗口外观,在所有应用程序中看起来都是同质的,并且不会干扰应用程序的正常运行


操作系统和应用程序之间的这种接口需要一个完整的消息传递API来通知窗口装饰何时更改等。

我不知道,如果您使用的是操作系统自己的窗口管理器,这可能不可能。原因是,标题栏是在Java之外绘制的。如果您真的需要这些信息,您可能需要使用JNI

但是,如果使用的是内部框架,则可以执行以下操作

JInternalFrame mydialog = new JInternalFrame();
((BasicInternalFrameUI)mydialog.getUI()).getNorthPane().getHeight();
但更重要的问题是,你为什么想知道?窗口系统的思想是,程序员可以从窗口环境中抽象出应用程序的内容。这样,用户可以动态定制窗口外观,在所有应用程序中看起来都是同质的,并且不会干扰应用程序的正常运行


操作系统和应用程序之间的这样一个接口需要一个完整的消息传递API来通知窗口装饰的变化等等。

kofucii,您走的是正确的道路-使用
对话框getInsets().top
,就像您在示例中所做的那样。 我猜您得到0可能是因为JDialog对象不可见。否则,“顶部”值应为~36

以下是一个孤立的案例:

package dejan.various;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;

/**
 *
 * @author dejan
 */
public class TestDialog extends JDialog implements ActionListener {
    private javax.swing.JButton testButton;

    public TestDialog() {
        setPreferredSize(new Dimension(640,480));
        getContentPane().setLayout(new BorderLayout());
        testButton = new JButton("Click me");
        testButton.addActionListener(this);
        getContentPane().add(testButton, BorderLayout.SOUTH);
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Insets insets = this.getInsets();
        System.out.println(insets.top);
        System.out.println(insets.left);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TestDialog().setVisible(true);
            }
        });
    }

} // TestDialog class
在标准上,我得到:

36
9

kofucii,您走的是正确的道路-使用
对话框getInsets().top
,就像您在示例中所做的那样。 我猜您得到0可能是因为JDialog对象不可见。否则,“顶部”值应为~36

以下是一个孤立的案例:

package dejan.various;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;

/**
 *
 * @author dejan
 */
public class TestDialog extends JDialog implements ActionListener {
    private javax.swing.JButton testButton;

    public TestDialog() {
        setPreferredSize(new Dimension(640,480));
        getContentPane().setLayout(new BorderLayout());
        testButton = new JButton("Click me");
        testButton.addActionListener(this);
        getContentPane().add(testButton, BorderLayout.SOUTH);
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Insets insets = this.getInsets();
        System.out.println(insets.top);
        System.out.println(insets.left);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TestDialog().setVisible(true);
            }
        });
    }

} // TestDialog class
在标准上,我得到:

36
9

要获取插图,需要确保JDialog可见。如果您在屏幕上显示之前尝试获取它,您得到了0。

要获取插图,您需要确保您的JDialog是可见的。如果您在屏幕上显示之前尝试获取它,您得到了0。

您是在可见或压缩的对话框中执行此操作的吗?并使用
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())@camickr,是的,它是可见的。与包装也没有区别。对我来说很好。发布您的SSCCE以演示问题。我的SSCCE是3行代码。一个用于创建对话框,一个用于使其可见,第三个用于打印插图。“我如何获得JDialog标题栏的高度?”您(认为您)为什么需要知道?您是在可见或压缩的对话框上执行此操作的吗?通过使用
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())@camickr,是的,它是可见的。与包装也没有区别。对我来说很好。发布您的SSCCE以演示问题。我的SSCCE是3行代码。一个用于创建对话框,一个用于使其可见,第三个用于打印插图。“我如何获得JDialog标题栏的高度?”为什么您(认为您)需要知道?如果海报使用的是“装饰”对话框或LAF绘制标题栏本身,这将起作用。如果海报使用的是一个“装饰”对话框,或者是一个可以自己绘制标题栏的LAF,这就可以了。否则应该避免。如果有人(即您的上司)要求您将打开的内部框架正确对齐,您可能想知道。如果有人(即您的上司)要求您将打开的内部框架正确对齐,您可能想知道。