我如何在JDesktopPane上默认选择一个InternalFrame?

时间:2010-11-03 14:43:52

标签: java jframe visibility jinternalframe jdesktoppane

我有一个带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及其选中? 当我运行应用程序时,内部框架就像在后台,它没有被选中,它没有聚焦。

2 个答案:

答案 0 :(得分: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 :(得分:0)

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

所以,你可以做的一个例子是:

  1. 创建主框架
  2. 创建桌面
  3. 创建内部框架但不显示
  4. 启动在内部框架上将visible设置为true的线程,但线程可以等到显示桌面
  5. 使主框架可见
  6. 在线程中调用internalFrame.setVisible(true)并退出线程。
  7. 在这种情况下,内部框架将出现在桌面上,并将根据需要进行选择。

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

    以下是您可以使用的示例:

    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();
        }
    }