Java Swing : Listening and repeating events from one frame in another

标签 java swing user-interface focus

我有 2 个框架:。我想做以下事情: 当父框架被激活或取消图标时,子框架会执行相同的操作。

private void attachListeners()
    {
        if (parentFrame != null)
        {
            parentFrame.addComponentListener(this);
            parentFrame.addWindowListener(new ViewEventAdapter(this));
        }
     @Override
        public void viewActivated()
        {            
            //  show it when the parent is activated
            if (!childFrame.isVisible())
            {  
                        childFrame.setVisible(true);
                        parentFrame.toFront();
            }
        }

但这会导致无限循环的闪烁。如果我删除 toFront(),我无法将焦点切换到父框架。我只需要以某种方式正确地切换焦点。

监听器代码:

    public class ViewEventAdapter implements WindowListener, InternalFrameListener
{
    private MyViewListener listener = null;


    public ViewEventAdapter(MiaViewListener inListener)
    {
        listener = inListener;
    }


    @Override
    public void windowActivated(WindowEvent inE)
    {
        listener.viewActivated();
    }


    @Override
    public void windowClosed(WindowEvent inE)
    {
        listener.viewClosed();
    }


    @Override
    public void windowClosing(WindowEvent inE)
    {
        listener.viewClosing();
    }


    @Override
    public void windowDeactivated(WindowEvent inE)
    {
        listener.viewDeactivated();
    }


    @Override
    public void windowDeiconified(WindowEvent inE)
    {
        listener.viewDeiconified();
    }


    @Override
    public void windowIconified(WindowEvent inE)
    {
        listener.viewIconified();
    }


    @Override
    public void windowOpened(WindowEvent inE)
    {
        listener.viewOpened();
    }


    @Override
    public void internalFrameActivated(InternalFrameEvent inE)
    {
        listener.viewActivated();
    }


    @Override
    public void internalFrameClosed(InternalFrameEvent inE)
    {
        listener.viewClosed();
    }


    @Override
    public void internalFrameClosing(InternalFrameEvent inE)
    {
        listener.viewClosing();
    }


    @Override
    public void internalFrameDeactivated(InternalFrameEvent inE)
    {
        listener.viewDeactivated();
    }


    @Override
    public void internalFrameDeiconified(InternalFrameEvent inE)
    {
        listener.viewDeiconified();
    }


    @Override
    public void internalFrameIconified(InternalFrameEvent inE)
    {
        listener.viewIconified();
    }


    @Override
    public void internalFrameOpened(InternalFrameEvent inE)
    {
        listener.viewOpened();
    }
}

public interface MyViewListener
{
    /**
     * Called when a view is activated
     */
    public void viewActivated();

    /**
     * Called when a view is closed
     */
    public void viewClosed();

    /**
     * Called when a view is closing
     */
    public void viewClosing();

    /**
     * Called when a view is deactivated
     */
    public void viewDeactivated();

    /**
     * Called when a view is deiconified
     */
    public void viewDeiconified();

    /**
     * Called when a view is iconified
     */
    public void viewIconified();

    /**
     * Called when a view is opened
     */
    public void viewOpened();
}

请帮忙。提前致谢。

最佳答案

不要使用 2 个 JFrame。

相反,父级应该是 JFrame,子级应该是非模式 JDialog。当您创建对话框时,您将框架指定为父框架,并且默认情况下您会获得此行为。

这是大多数应用程序的设计方式。

关于Java Swing : Listening and repeating events from one frame in another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594517/

相关文章:

java - JScrollPane 内的 JEditorPane 不显示滚动条

java - 在 invokeLater() 或 invokeAndWait 的情况下是否给出了发生前关系?

c++ - Stroustrup 的 PPP 书中的多边形问题

java - 无法从单选按钮正确地将值添加到 ArrayList - Java GUI

android - 如何为不同宽高比的屏幕尺寸布局按钮

java - 使用面板管理 pressButton

java - ArrayList不包含字符串

java - 如何为 Android 设置背景图片?

javascript - Java Socket 和 JS WebSocket

java - JComponent 未注册