我正在创建一个多用户Swing GUI应用程序,并希望用户的窗口位置和大小设置在用户注销和返回时保持不变。当用户注销并将其保存到文件中时,我目前正在使用父getLocation()和getSize()方法获取窗口位置和大小,然后当用户重新登录时,我将返回这些值,并使用setLocation()和setSize()设置窗口大小和位置。
我遇到的问题是,getLocation()和getSize()似乎正在从系统边框中减去(例如,如果我将窗口放在左上角getLocation返回(1,54)而不是(0,0)),但setLocation()和setSize()没有。结果是,每次我登出并重新登录时,窗口看起来都有点偏移,比关闭时稍微小一些。
有人知道为什么会发生这种事吗?或者我怎样才能避开它?我是否应该使用其他方法来获取和设置窗口位置和大小?
我正在Ubuntu12.04上运行java 1.7.0_45,如果这有帮助的话。
谢谢!
编辑:
下面的示例复制了我所看到的问题:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class JFrameTest
{
private JFrame frame;
private JButton button;
private Point lastLocation;
private Dimension lastSize;
private void run()
{
button = new JButton("Test");
button.addActionListener(listener);
lastLocation = new Point(0, 0);
lastSize = new Dimension(200, 200);
initFrame();
}
private void initFrame()
{
frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.getContentPane().add(button);
frame.setLocation(lastLocation);
frame.setPreferredSize(lastSize);
frame.pack();
frame.setVisible(true);
}
private ActionListener listener = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == button)
{
lastLocation = frame.getLocationOnScreen();
lastSize = frame.getSize();
frame.dispose();
initFrame();
}
}
};
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
new JFrameTest().run();
}
});
}
}另外,当我使用getLocationOnScreen()而不是getLocation()时,我也看到了同样的问题。
发布于 2014-04-15 03:54:41
您可以使用getLocationOnScreen()
以指定该组件在屏幕坐标空间中左上角的点的形式获取此组件的位置。
https://stackoverflow.com/questions/23074312
复制相似问题