setDefaultCloseOperation不起作用

时间:2016-04-05 11:36:24

标签: java swing

刚刚开始使用GUI,我真的对这段代码感到困惑,出于某种原因,当我设置默认关闭操作时,它不起作用,并且在添加JLabel和TextField等组件时也是如此。我用JFrame扩展了我的类,我的程序中没有其他同名的JFrame或JPanel。哦,而且,setVisible和setSize仍然有效,它只是在添加组件或设置关闭操作时。这是调用包含makeWindow()调用方法的类。

    public static class Play implements ActionListener{
    public void actionPerformed(ActionEvent e){
        frame.setVisible(false);
        game.playGame();
    }

这是实际的方法:

    private void makeWindow() {
    JFrame window = new JFrame("Battleships 2.0");
    JPanel canvas = new JPanel();

    JLabel title = new JLabel("Battleships 2.0");
    title.setFont(font);

    JTextField userCoordinates = new JTextField();

    window.setSize(500,500);
    window.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    window.setResizable(false);
    window.setVisible(true);

    canvas.setLayout(new BoxLayout(canvas, BoxLayout.Y_AXIS));

    window.add(canvas);
    canvas.add(title);
    canvas.add(userCoordinates);
}

1 个答案:

答案 0 :(得分:3)

如果您在类中扩展了JFrame,那么您不需要在方法中再次创建JFrame对象。您使用了BOXLayout,因此您的文本字段占据整个面板,标签显示在顶部。 我刚刚修改了你的代码以使用FlowLayout,并且控件清晰可见。 检查一下:

private void makeWindow() {
        // JFrame window = new JFrame("Battleships 2.0");
        setTitle("Battleships 2.0");
        JPanel canvas = new JPanel();

        JLabel title = new JLabel("Battleships 2.0");
        // title.setFont(font);

        JTextField userCoordinates = new JTextField(10);

        setSize(500, 500);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);
        setVisible(true);

        canvas.setLayout(new FlowLayout());

        add(canvas);
        canvas.add(title);
        canvas.add(userCoordinates);
    }