似乎Ubuntu存在一个错误(可能只有统一)。 getLocation()
和getSize()
考虑了JFrame的装饰,但setLocation()
和setSize()
没有考虑。这导致了奇怪的行为。例如,如果在显示框架并更改尺寸后使用pack(),则框架将下降20像素......
为了说明一个令人讨厌的具体案例,我做了一个SSCCE。它是一个带有基本JPanel的JFrame。如果拖动面板,JFrame应该继续移动。
在Windows下,它按预期工作。在Ubuntu下,如果我做setUndecorated(true)
它也会正常工作,但如果我让装饰,那么JFrame会变得疯狂!
public class Test {
private static JFrame mainFrame;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
mainFrame = new JFrame("test");
mainFrame.setSize(300,20);
mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainFrame.setVisible(true);
Container pane = mainFrame.getContentPane();
pane.addMouseMotionListener(new MouseMotionListener() {
private int posX = 0, posY = 0;
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX() - posX + mainFrame.getX();
int y = e.getY() - posY + mainFrame.getY();
mainFrame.setLocation(x, y);
}
@Override
public void mouseMoved(MouseEvent e) {
posX = e.getX();
posY = e.getY();
}
});
}
});
}
}
我不知道如何解决这个问题。如何获得窗户装饰的尺寸?我不知道Ubuntu的哪个版本。如果它只是一个Unity问题,我甚至不知道如何确定我的用户是否使用Unity ...
有任何解决方法吗?
修改: 好吧,MadProgrammer确实提供了更好的代码,但有时仍然会出现这个问题。我相应地编辑了我的MouseListener以跟踪错误:
pane.addMouseMotionListener(new MouseMotionListener() {
private int posX = 0, posY = 0;
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getXOnScreen() - posX;
int y = e.getYOnScreen() - posY;
mainFrame.setLocation(x, y);
System.out.println("drag : border ignored / border considered : "+(mainFrame.getY()+e.getY())+" / "+e.getYOnScreen());
}
@Override
public void mouseMoved(MouseEvent e) {
posX = e.getXOnScreen() - mainFrame.getX();
posY = e.getYOnScreen() - mainFrame.getY();
System.out.println("move : border ignored / border considered : "+e.getY()+" / "+posY);
}
});
每次2个值相同时,表示错误将在下次点击时发生。否则,值不同。在其他操作系统上,值始终相同。实际上,它们应始终相同或始终不同。我不明白他们有时是平等的,有时候是不同的......
答案 0 :(得分:1)
我没有Ubuntu进行测试,但我在MacOS和Windows上都使用了类似的东西
<!DOCTYPE html>
<head>
<!--<link href="style.css" rel="stylesheet" type="text/css">-->
<script src="function.js"></script>
</head>
<header>
<nav>
<img src="logo.jpg"><h1 id="titt">North Park Clubs</h1>
<li>
<a href="attendance.html">Attendance</a>
<a href="addStudent.html">Add Student</a>
</li>
</nav>
</header>
<body>
<h1>Add A Student</h1>
<input type="text" id="sFirstName" placeholder="First Name"></input>
<input type="text" id="sLastName" placeholder="Last Name"></input>
<input type="text" id="sNumber" placeholder="Student Number"></input>
<input type="text" id="sPoints" placeholder="Points"></input>
<input type="button" id="checkbox"onclick="save()" value="Save"></input>
</body>
这应该适用于装饰和未修饰的窗口,因为它取决于组件(在屏幕上)的位置和窗口当前位置之间的差异。拖动时,它会计算从点击点移动的距离并相应地更新窗口的位置(允许点击的原始偏移量)