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的任何边框。你需要把它们减去
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,这就可以了。否则应该避免。如果有人(即您的上司)要求您将打开的内部框架正确对齐,您可能想知道。如果有人(即您的上司)要求您将打开的内部框架正确对齐,您可能想知道。