恢复已在本地创建的最小化JFrame

时间:2015-11-27 15:11:07

标签: java swing jframe jpanel

我的班级Output.java扩展了JPanel。在另一个类中,用户可以单击一个图标,然后在本地创建一个JFrame Output.java。我们发现,有时用户最小化该窗口然后会想要它。然后,他将重新点击该图标,然后重新创建JFrame。通过这样做几次,Output.java类会多次显示。

我发现可以通过添加以下内容来禁用多个JFrame创建:

    if (!output.isShowing())
        openPage(output);

但它无法恢复JFrame。有没有办法在这种情况下恢复最小化JFrame

icon.addMouseListener(new MouseAdapter() {  
    public void mouseClicked(MouseEvent e) {  
        openPage(outputsSlavePane);
    }  
});

private void openPage(final Output panel) {
    JFrame frame = new JFrame("Output");
    frame.add(panel);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            panel.setLostFocus();
        }
    });
}

感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过调用

恢复最小化的帧
frame.setState(JFrame.NORMAL);

可以通过

检索帧的当前状态
frame.getState() // NORMAL or ICONIFIED

答案 1 :(得分:3)

  1. 不要继续创建 JFrame。
  2. 而是创建一个引用JFrame的字段,然后恢复该字段,而不是新的JFrame。
  3. 创建一个字段以引用JDialog。如果该字段为null,则在本地创建它并将其分配给该字段(这称为“延迟”创建)。如果该字段不为null,则不要重新创建它,只需显示它。
  4. 话虽如此,大多数Swing GUI应用程序应该只有一个JFrame,只有一个主应用程序窗口。如果需要子窗口,它们应该是JDialogs,而不是JFrame。请查看The Use of Multiple JFrames, Good/Bad Practice?
  5. “懒惰”创作的一个例子:

    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Window;
    import java.awt.Dialog.ModalityType;
    import java.awt.event.ActionEvent;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class LazyCreation extends JPanel {
        private static final int PREF_W = 400;
        private static final int PREF_H = PREF_W;
        private Output output = new Output();
        private JDialog outputDialog = null;
    
        public LazyCreation() {
            add(new JButton(new DisplayOutputAction("Display Output")));
        }
    
        @Override
        public Dimension getPreferredSize() {
            if (isPreferredSizeSet()) {
                return super.getPreferredSize();
            }
            return new Dimension(PREF_W, PREF_H);
        }
    
        private class DisplayOutputAction extends AbstractAction {
            public DisplayOutputAction(String name) {
                super(name);
                int mnemonic = (int) name.charAt(0);
                putValue(MNEMONIC_KEY, mnemonic);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                // lazily create dialog here
                if (outputDialog == null) {
                    Window currentWin = SwingUtilities.getWindowAncestor(LazyCreation.this);
                    outputDialog = new JDialog(currentWin, "Output Dialog", ModalityType.MODELESS);
                    outputDialog.add(output);
                    outputDialog.pack();
                    outputDialog.setLocationRelativeTo(currentWin);
                }
                outputDialog.setVisible(true);
    
            }
        }
    
        private static void createAndShowGui() {
            LazyCreation mainPanel = new LazyCreation();
    
            JFrame frame = new JFrame("LazyCreation");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGui();
                }
            });
        }
    }
    
    
    class Output extends JPanel {
        private JLabel label = new JLabel("Output", SwingConstants.CENTER);
    
        public Output() {
            label.setFont(label.getFont().deriveFont(Font.BOLD, 36));
            add(label);
        }
    }