gpt4 book ai didi

Java JFrame 边界

转载 作者:行者123 更新时间:2023-12-02 04:01:37 27 4
gpt4 key购买 nike

我正在尝试编写执行以下操作的代码:如果我单击起始位置为 (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,其中包含 contentPaneJMenuBar玻璃 Pane

RootPane

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

您可以查看How can I set in the midst? , Graphics rendering in title barHow to get the EXACT middle of a screen, even when re-sized了解更多详细信息和示例。

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

简单的解决方案是停止使用“神奇”数字,并查看框架使用的内容,即 contentPanecontentPaneJFrame(通过 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com