Java JFrame 边界

标签 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));

为了达到我想要的目的?

最佳答案

首先,了解 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/

相关文章:

java - 更改任何文件的默认应用程序

java - 不同类之间的Repaint()不更新

java - 如何使 Tomcat 中的所有 session 过期?

java - 在 Java 应用程序中获取任何/所有 Activity 的 JFrame?

java - 如何使用java从Excel工作表中读取图表?

java - 停止显示一个窗口直到它被完全绘制?

java Swing 停止函数

java - 当鼠标在 JFrame 内移动时,Swing Timer 停止调用 actionPerformed()

java - 在 JTextPane 中更改文本光标大小

java - Java 中的 Matcher.find() 对正则表达式进行分组时出现错误结果