Java JFrame边界

时间:2016-01-17 06:28:22

标签: java swing

我正在尝试编写执行以下操作的代码: 如果我点击起始位置为(100,100)的字符串C(JLabel),字符串将移动到JFrame的边界。代码本身并不难实现,但我遇到了问题设置JLabel的(x,y),以便字符串“C”的任何部分都不会被截断。

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class adfadf extends JFrame{
    JLabel text = new JLabel("C");
    Container container = getContentPane();
    public adfadf(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        container.setLayout(null);
        MyMouseListener mml = new MyMouseListener();
        text.addMouseListener(mml);
        text.setLocation(100,100);
        text.setSize(30,30);
        add(text);
        setSize(400,400);
        setVisible(true);
    }


    public static void main(String[] args) {
        new adfadf();

    }

}
class MyMouseListener extends MouseAdapter{
    @Override
    public void mouseClicked(MouseEvent e){
        JLabel text = (JLabel)e.getSource();
        int x = (int)(Math.random()*(400-30));
        int y = (int)(Math.random()*(400-30));
        text.setLocation(x,y);
    }

}

我应该如何更改

int x = (int)(Math.random()*(400-30));
int y = (int)(Math.random()*(400-30));

为了达到我想要的目的?

1 个答案:

答案 0 :(得分:2)

首先,要理解JFrame似乎要复杂得多{/ p>

首先,JRootPane有一个contentPane,其中包含JMenuBarglassPane以及contentPane

http://dojo.telerik.com/AtebI/10

由于窗口的装饰实际上是在框架的可见边界内绘制的,因此内容可用的可见区域实际上小于框架的大小,这使事情变得更加复杂。

您可以查看RootPaneHow can I set in the midst?Graphics rendering in title bar了解更多详情和示例。

但这对你有什么帮助?那么,现在你知道你有一个小于400x400的空间来显示你的标签,但是多少?

简单的解决方案是停止使用“魔术”数字,并查看框架使用的内容contentPaneJFrameJRootPane(通过JLabel text = (JLabel)e.getSource(); int width = getContentPane().getSize().width; int height = getContentPane().getSize().height; int x = (int)(Math.random()*(width-30)); int y = (int)(Math.random()*(height-30)); text.setLocation(x,y); )进行管理,以便它位于框架装饰中,因此您可以执行更类似的操作...

contentPane

在这个例子中查看 if(!$(this).siblings('.youtubevideo').find("iframe").prop("src")){ $(this).siblings('.youtubevideo').find("iframe").prop("src", function(){ return $(this).data("src"); }); } 的原因仅仅是因为,这是实际添加标签的容器。

这是我们建议您不使用“魔术”数字的原因之一,但在您需要时查看实际已知值。