JFrame错误的位置与Ubuntu(Unity?)

时间:2015-06-15 01:19:12

标签: java swing ubuntu jframe location

似乎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个值相同时,表示错误将在下次点击时发生。否则,值不同。在其他操作系统上,值始终相同。实际上,它们应始终相同或始终不同。我不明白他们有时是平等的,有时候是不同的......

1 个答案:

答案 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>

这应该适用于装饰和未修饰的窗口,因为它取决于组件(在屏幕上)的位置和窗口当前位置之间的差异。拖动时,它会计算从点击点移动的距离并相应地更新窗口的位置(允许点击的原始偏移量)