我正在尝试编写执行以下操作的代码: 如果我单击起始位置为 (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));
为了达到我想要的目的?
最佳答案
首先,了解 JFrame
比看起来要复杂得多
首先,JFrame
有一个 JRootPane
,其中包含 contentPane
和 JMenuBar
和 玻璃 Pane
由于窗口的装饰实际上是在框架的可见边界内绘制的,这意味着内容可用的可见区域实际上小于框架的大小,这使情况变得更加复杂。
您可以查看How can I set in the midst? , Graphics rendering in title bar和 How to get the EXACT middle of a screen, even when re-sized了解更多详细信息和示例。
但是这对你有什么帮助呢?好吧,现在您知道您有一个小于 400x400 的空间来显示标签,但是多少呢?
简单的解决方案是停止使用“神奇”数字,并查看框架使用的内容,即 contentPane
。 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
的原因很简单,因为那是标签实际添加到的容器。
这就是为什么我们建议您不要使用“魔法”数字,而是在需要时查看实际的已知值的原因之一。
关于Java JFrame 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835767/