我正在尝试编写执行以下操作的代码: 如果我点击起始位置为(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));
为了达到我想要的目的?
答案 0 :(得分:2)
首先,要理解JFrame
似乎要复杂得多{/ p>
首先,JRootPane
有一个contentPane
,其中包含JMenuBar
和glassPane
以及contentPane
http://dojo.telerik.com/AtebI/10
由于窗口的装饰实际上是在框架的可见边界内绘制的,因此内容可用的可见区域实际上小于框架的大小,这使事情变得更加复杂。
您可以查看,How can I set in the midst?和Graphics rendering in title bar了解更多详情和示例。
但这对你有什么帮助?那么,现在你知道你有一个小于400x400的空间来显示你的标签,但是多少?
简单的解决方案是停止使用“魔术”数字,并查看框架使用的内容contentPane
。 JFrame
由JRootPane
(通过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");
});
}
的原因仅仅是因为,这是实际添加标签的容器。
这是我们建议您不使用“魔术”数字的原因之一,但在您需要时查看实际已知值。