【问题标题】:How I can selected by default an InternalFrame on a JDesktopPane?如何在 JDesktopPane 上默认选择 InternalFrame?
【发布时间】:2011-05-04 13:05:45
【问题描述】:

我有一个带有 JDesktopPane 的 JFrame,在 JDesktopPane 内部,我使用构造函数 JInternalFrame 启动。 (它是一个类似于认证用户的应用,带有文本框用户和文本框通行证)

我像这样启动内部:

MyInternalFrame internalF = new MyInternalFrame();
desktopPane.add(internalF);

我尝试:

internalF.setVisible(true);
internalF.setSelected(true);
desktopPane.getDesktopManager().activateFrame(internal);
desktopPane.setSelectedFrame(internal);

如何启动 JInternalFrame 及其默认选择? 当我运行应用程序时,internalframe 就像在后台一样,它没有被选中,它没有聚焦。

【问题讨论】:

    标签: java jframe visibility jinternalframe jdesktoppane


    【解决方案1】:

    看看How To Use Internal Frames java 教程。它给出了一个很好的例子并使用了以下内容;

    protected void createFrame() {
        MyInternalFrame frame = new MyInternalFrame();
        frame.setVisible(true);
        desktop.add(frame);
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {}
    }
    

    【讨论】:

    • +1,教程不仅对这个问题有帮助,而且可以作为以后问题的参考。
    【解决方案2】:

    您可以在创建桌面并且主框架可见之后使内部框架可见。在这种情况下,将默认选择框架。

    那么,你可以做的一个例子:

    1. 创建主框架
    2. 创建桌面
    3. 创建内部框架但不使其可见
    4. 在内部框架上启动将 visible 设置为 true 的线程,但该线程可以等到桌面显示出来
    5. 使主框架可见
    6. 在线程中调用 internalFrame.setVisible(true) 并退出线程。

    在这种情况下,内部框架将出现在桌面上,并且会根据您的需要进行选择。

    您可能会想到其他不使用线程的解决方案,而是将处理程序写入主框架的事件。无论如何,要使内部框架在显示后可见,您必须在显示主框架的桌面后显示它。

    下面是示例,您可以使用:

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.HeadlessException;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.JInternalFrame;
    
    
    public class Main extends JFrame {
    
        private static final long serialVersionUID = 1L;
    
        private Internal internalFrame;
    
        public Main() throws HeadlessException {
            super("Internal Frame Test");
    
            setBounds(10, 10, 600, 400);
    
            setDefaultCloseOperation(EXIT_ON_CLOSE);
    
            this.setLayout(new BorderLayout());
    
            add(createDesktop(), BorderLayout.CENTER);
    
            addWindowListener(new WindowAdapter() {
                public void windowOpened(WindowEvent e) {
                    internalFrame.setVisible(true);
                }
            });
    
            setVisible(true);
        }
    
        private Component createDesktop() {
            JDesktopPane d = new JDesktopPane();
    
            internalFrame = new Internal("first");
            d.add(internalFrame);
    
            return d;
        }
    
        public static class Internal extends JInternalFrame {
    
            private static final long serialVersionUID = 1L;
    
            public Internal(String title) {
                super(title);
                setBounds(10, 10, 300, 100);
            }
        }
    
        public static void main(String[] a) {
            new Main();
        }
    }
    

    【讨论】:

    • 我添加了一个示例。你可以试试看。
    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2015-11-15
    相关资源
    最近更新 更多