1

所以我在 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";
    }
}
4

1 回答 1

1

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

SwingUtilities.getWindowAncestor(Component c)

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

于 2013-07-03T01:24:14.750 回答