Dispose()只工作一次

时间:2017-03-03 20:16:02

标签: java swing

我的问题是我有一个类,当用户输出显示的文本时,会调用dispose(),这是第一次有效,但是如果你不关闭程序并再次打开它,则dispose()被称为,但没有做任何破坏程序的事情。

public class TypeMenu extends JDialog {

    protected final JPanel contentPanel = new JPanel();
    protected static JTextField inputTxtField;
    protected static JTextField textField;
    protected static JTextField introTxtField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            Easy dialog = new Easy();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the dialog.
     * @param introTxtField2 
     * @param textField2 
     * @param inputTxtField2 
     */
    public TypeMenu(JTextField inputTxtField2, JTextField introTxtField2, JTextField textField2) {
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);
        contentPanel.add(getInputTxtField());
        contentPanel.add(getTextField());
        contentPanel.add(getIntroTxtField());
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
        }
    }
    protected JTextField getInputTxtField() {
        if (inputTxtField == null) {
            inputTxtField = new JTextField();
            inputTxtField.setHorizontalAlignment(SwingConstants.CENTER);
            inputTxtField.addKeyListener(new KeyAdapter() {
                @Override
                public void keyReleased(KeyEvent arg0) {
                    String strField = textField.getText();
                    char key = arg0.getKeyChar();
                    int length = strField.length();
                    if (Character.toLowerCase(strField.charAt(0)) == Character.toLowerCase(key)) {
                        inputTxtField.setText(" ");
                        textField.setText(strField.substring(1));
                        System.out.println(length);
                        System.out.println(strField);
                        if (length - 1 <= 0) {
                            dispose();
                        }
                    } else {
                        inputTxtField.setText(" ");
                    } 
                }
            });
            inputTxtField.setBounds(56, 177, 314, 40);
            inputTxtField.setColumns(10);
        }
        return inputTxtField;
    }
    protected JTextField getIntroTxtField() {
        if (introTxtField == null) {
            introTxtField = new JTextField();
            introTxtField.setHorizontalAlignment(SwingConstants.CENTER);
            introTxtField.setFont(new Font("Tahoma", Font.BOLD, 15));
            introTxtField.setText("Easy Mode");
            introTxtField.setEditable(false);
            introTxtField.setBounds(56, 11, 314, 29);
            introTxtField.setColumns(10);
        }
        return introTxtField;
    }
    private JTextField getTextField() {
        if (textField == null) {
            textField = new JTextField();
            textField.setHorizontalAlignment(SwingConstants.CENTER);
            textField.setFont(new Font("Monospaced", Font.BOLD, 20));
            textField.setBounds(10, 51, 414, 40);
        }
        return textField;
    }
}

这是其中一个子类

public class Easy extends TypeMenu {

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            Easy dialog = new Easy();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Create the dialog.
     */
    public Easy() {
        super(inputTxtField, introTxtField, textField);
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);
        contentPanel.add(getInputTxtField());
        contentPanel.add(getIntroTxtField());
        getString();
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            textField.selectAll();
        }
    }
    private void getString() {
        String str = textField.getText();
        if (str.equals("")) {
            String generator = StringGenerator.medium();
            String nStr = "" + generator;
            textField.setText(nStr);
        }
    }
}

调用此类的代码

public class StartMenu扩展了JDialog {

private final JPanel contentPanel = new JPanel();
private JTextField introTxt;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    try {
        StartMenu dialog = new StartMenu();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Creates the dialog and creates the buttons that take the user to each variation of the game when pressed.
 */
public StartMenu() {
    setBounds(100, 100, 450, 300);
    getContentPane().setLayout(new BorderLayout());
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    getContentPane().add(contentPanel, BorderLayout.CENTER);
    contentPanel.setLayout(null);
    {
        introTxt = new JTextField();
        introTxt.setFont(new Font("Tahoma", Font.BOLD, 12));
        introTxt.setHorizontalAlignment(SwingConstants.CENTER);
        introTxt.setText("Start Menu\r\n");
        introTxt.setEditable(false);
        introTxt.setBounds(75, 11, 276, 20);
        contentPanel.add(introTxt);
        introTxt.setColumns(10);
    }
    {
        JButton btnEasyButton = new JButton("Easy Mode");
        btnEasyButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                new Easy().setVisible(true);
            }
        });
        btnEasyButton.setBounds(141, 42, 140, 23);
        contentPanel.add(btnEasyButton);    
    }
    {
        JButton btnMediumButton = new JButton("Medium Mode");
        btnMediumButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                new Medium().setVisible(true);
            }
        });
        btnMediumButton.setBounds(141, 81, 140, 23);
        contentPanel.add(btnMediumButton);
    }
    {
        JButton btnHardButton = new JButton("Hard Mode");
        btnHardButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                new Hard().setVisible(true);
            }
        });
        btnHardButton.setBounds(141, 120, 140, 23);
        contentPanel.add(btnHardButton);
    }
    {
        JPanel buttonPane = new JPanel();
        buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        {
            JButton okButton = new JButton("OK");
            okButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    dispose();
                }
            });
            okButton.setActionCommand("OK");
            buttonPane.add(okButton);
            getRootPane().setDefaultButton(okButton);
        }
    }
}

}

2 个答案:

答案 0 :(得分:1)

您的文本字段是静态的,因此他在整个应用程序中只有一个实例。 所以在方法getIntroTxtField()中你有if语句:

if (introTxtField == null) 

在第一次出现这种情况时,但是当你创建新实例时,这个条件是假的,因为静态字段的实例都是在第一个中准备好的,你在条件中添加了键监听器 所以动作监听器只会在第一次创建时添加。 如果您需要保留static,因为您需要在其他课程中删除== null

protected JTextField getInputTxtField() {
    inputTxtField = null;
   {
        inputTxtField = new JTextField();
        inputTxtField.setHorizontalAlignment(SwingConstants.CENTER);
        inputTxtField.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent arg0) {
                String strField = textField.getText();
                char key = arg0.getKeyChar();
                int length = strField.length();
                if (Character.toLowerCase(strField.charAt(0)) == Character.toLowerCase(key)) {
                    inputTxtField.setText(" ");
                    textField.setText(strField.substring(1));
                    System.out.println(length);
                    System.out.println(strField);
                    if (length - 1 <= 0) {
                        dispose();
                    }
                } else {
                    inputTxtField.setText(" ");
                } 
            }
        });
        inputTxtField.setBounds(56, 177, 314, 40);
        inputTxtField.setColumns(10);
    }
    return inputTxtField;
}
  

或从中删除static字段声明中使用静态   只有当你只使用一个实例时才共享instace   像sessionFactory这样的应用程序或任何需要创建的东西   只有一次。

答案 1 :(得分:0)

你的代码很多,但我认为你的问题是你正在调用错误对象的dispose()。你可能总是为第一个对象调用它而你正在创建一个新对象,并且永远不会调用这个新对话框的处理,检查代码可能是你创建了很多对象而且根本没有调用dispose() 。确保您完全控制对象实例,以了解您是否在想要对话框。