Netbeans创建后关闭JFrame

时间:2017-08-29 19:57:56

标签: java swing netbeans

我想在创建后关闭JFrame。

(不是按钮)。

但在构造函数

public class ClientSideForm extends javax.swing.JFrame {

    LocalInformation li = new LocalInformation();       
    ClientSetting cs = new ClientSetting();

    public ClientSideForm() throws UnknownHostException {
        initComponents();

        setLocalInfo();
        setDefault();

        try {
            if (!StartApp()) {
                JOptionPane.showMessageDialog(rootPane, "Terjadi Kesalahan Dalam Membuka Aplikasi Utama", "Kesalahan", JOptionPane.ERROR_MESSAGE);                
            } else {

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        this.dispose();
    }
}

如果我在按钮上实现它可以很好地工作

但是我想在创建它之后关闭这个JFrame。

由于

1 个答案:

答案 0 :(得分:2)

  

创建后我想关闭JFrame   (不是按钮)。
  但在构造函数

没有。你没有。您不希望尝试显示Swing GUI对象,然后在完全构造之前将其关闭。我想要做的(你的问题还不完全清楚)是显示窗口,显示JOptionPane,然后关闭GUI窗口。如果是这样,您希望在调用GUI对象的构造函数的代码中执行此操作,而不是在构造函数中执行此操作,以便您处理完全实现的对象。例如,像:

ClientSideForm clientForm = new ClientSideForm();
clientForm.setVisible(true);
JOptionPane.showMessageDialog(rootPane, "Terjadi Kesalahan Dalam Membuka Aplikasi Utama", 
        "Kesalahan", JOptionPane.ERROR_MESSAGE);
clientForm.dispose();

附注:

  • 该按钮有效,因为即使它是在ClientSideForm构造函数调用的方法中创建的,即使它的ActionListener可能已经附加在代码的同一部分中,它也不会在构造函数中执行其操作,但只能在之后执行,在完全创建并显示ClientSideForm对象后,按下按钮会激活其ActionListener的操作。
  • 如果您的GUI有几个显示然后消失的JFrame,请考虑修改更加用户友好的结构,因为大多数用户都不希望将一堆窗口推送给他们。请查看The Use of Multiple JFrames, Good/Bad Practice?,看看为什么这很重要,并查看可用的替代方案。
  • 如果要在一段时间内显示GUI,然后关闭,请使用Swing Timer进行此操作。
  • 您可能通过让您的类扩展JFrame来强迫您创建和显示JFrame,而通常需要更多的灵活性。事实上,我冒昧地说,我已经创建的大部分Swing GUI代码都是扩展JFrame,事实上你很少&#39 ;我会想要这样做。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。

例如,下面的代码将显示一个GUI,一半时间会显示一条JOptionPane错误消息,然后在关闭错误消息后关闭GUI,另一半时间将显示GUI持续2秒,然后自动关闭:

import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

@SuppressWarnings("serial")
public class TestPanel extends JPanel {
    private static final int PREF_W = 500;
    private static final int PREF_H = 400;
    private static final int TIMER_DELAY = 2 * 1000; // 2 seconds

    public TestPanel() {
        JLabel label = new JLabel("Test GUI");
        label.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 100));

        setPreferredSize(new Dimension(PREF_W, PREF_H));
        setLayout(new GridBagLayout());
        add(label);
    }


    // this code is called from a main method, but could be called anywhere, from 
    // a JButton's action listener perhaps. If so, then I'd probably not create
    // a new JFrame but rather a JDialog, and place my TestPanel within it
    private static void createAndShowGui() {
        TestPanel mainPanel = new TestPanel();

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        if (Math.random() > 0.5) {
            // 50% chance of this happening
            String message = "Error In Opening Main App";
            int type = JOptionPane.ERROR_MESSAGE;
            JOptionPane.showMessageDialog(frame, message, "Error", type);
            frame.dispose();
        } else {
            // run timer
            new Timer(TIMER_DELAY, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    frame.dispose();  // dispose gui when time's up
                    ((Timer) e.getSource()).stop();  // and stop the timer
                }

            }).start();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

}