【问题标题】:Find the JFrame an element is in查找元素所在的 JFrame
【发布时间】:2013-07-03 01:22:15
【问题描述】:

所以我在 JFrame 中的 JLabel 中有一个对象。

我无法更改 JLabel/JFrame 的代码。

如何让对象返回它所在的 JFrame?

图形用户界面

import javax.swing.*;
public class GUI extends JFrame
{
    public GUI()
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        setSize(100,50);

        JLabel label = new JLabel(new TestObject().toString());
        label.setBounds(5,5,90,20);
        add(label);

        setVisible(true);
    }
}

我的对象

public class TestObject
{
    public String toString()
    {
        return "TestObject";
    }
}

我尝试过的东西,但它打印为空

import java.awt.*;
import javax.swing.*;
public class TestObject
{
    public TestObject()
    {
        new Bug();
    }
    public String toString()
    {
        return "TestObject";
    }
    private class Bug extends Component
    {
        public Bug()
        {
            System.out.println(SwingUtilities.getWindowAncestor(this));
        }
    }
}

我可以这样做,但前提是我已经知道标题

import java.awt.*;
import javax.swing.*;
public class TestObject
{
    public TestObject()
    {
        for(Window w : Window.getWindows())
        {
            Frame f = (Frame) w;
            if(f.getTitle().equals("hi"))
            {
                JFrame g = (JFrame) f;
                JLabel j = new JLabel("Test");
                j.setBounds(5,20,90,20);
                g.add(j);
                g.repaint();
            }
        }
    }
    public String toString()
    {
        return "TestObject";
    }
}

【问题讨论】:

  • “我无法更改 JLabel/JFrame 的代码。” 除非它被声明为 final,否则可以 extend 类。这通常为更改或扩展类提供了几乎同样多的控制权。

标签: java swing object window jframe


【解决方案1】:

您可以随时使用SwingUtilities 来帮助您:

SwingUtilities.getWindowAncestor(Component c)

这将返回一个顶级 Window 对象,它将是组件的祖先 JFrame 如果组件由 JFrame 持有。如果它由不同的顶级窗口持有,例如 JDialog,那么这就是将返回的内容。如果组件还没有被窗口持有,那么这将根据SwingUtilities API 返回 null。请注意,如果您想使用以特定于 JFrame 的方式返回的对象,您可能需要进行一些转换(在首先检查之后)。

【讨论】:

  • 我的对象不是组件
  • @KonradWright:那么请澄清一下。您声明您的对象在 JFrame 中。如果不是组件,它是如何“在”JFrame 中的?请给我们一些上下文,也许还有一些代码。
  • 我目前正在使用 gridworld 代码:/ 我试图弄清楚演员所在的窗口。但我会看看我能做些什么来用简单的方法模拟这个代码。
  • @KonradWright:不完全是。我看不出您要测试的内容是什么。如果是 JLabel,那么使用我上面展示的方法。如果是字符串,那么你就不走运了,因为字符串不知道它的位置。
  • 如果我要做这样的事情怎么办? ` 导入 java.awt.*;导入 javax.swing.*;公共类 TestObject { public TestObject() { new Bug(); } public String toString() { return "TestObject"; } 私有类 Bug 扩展组件 { public Bug() { System.out.println(SwingUtilities.getWindowAncestor(this)); } } } `
猜你喜欢
  • 2010-10-02
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2013-11-10
  • 2021-02-05
相关资源
最近更新 更多