【问题标题】:how to know the exact size of container or windows on screen?如何知道屏幕上容器或窗口的确切大小?
【发布时间】:2012-11-04 13:45:12
【问题描述】:
我有一个JFrame,其中包含一个JButton,当JFrame 出现时,用户将调整JFrame 的大小,然后单击JButton 即可:
System.out.print("actual size now = "+JFrame.getsize");
但大小不会导致屏幕上JFrame 的实际大小。
我用的时候尺寸还是不对:
我该怎么办?
非常感谢您的任何帮助
【问题讨论】:
标签:
java
swing
size
jframe
containers
【解决方案1】:
您得到的大小是JFrames contentPane 的大小和添加的Insets 的大小。只需调用JFrame#getInsets() 并从JFrames width 和height 中减去它们,您可以通过JFrame#getSize() 获得。
这是一个例子:
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.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public Test() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void initComponents() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel() {
@Override
public Dimension getPreferredSize() {//the frame should now return a width and height of 300
return new Dimension(300, 300);
}
};
JButton button = new JButton("Get JFrame real width and height");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
Dimension frameSize = frame.getSize();
Insets insets = frame.getInsets();
System.out.println("Frame size via getSize(): " + frameSize);
System.out.println("Insets: " + insets);
double width = frameSize.getWidth();
double height = frameSize.getHeight();
//calculate real width/height
double realWidth = width - (insets.left + insets.right);
double realHeight = height - (insets.top + insets.bottom);
System.out.println("Width: " + realWidth + " Height: " + realHeight);
}
});
panel.add(button);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
输出:
通过 getSize() 获得的帧大小:java.awt.Dimension[width=316,height=338]
插图:java.awt.Insets[top=30,left=8,bottom=8,right=8]
宽度:300.0 高度:300.0