2016-04-05 46 views
0

刚开始使用GUI时,由于某种原因,当我设置默认的关闭操作时,它无法正常工作,而且在添加JLabel和TextField等组件时也是如此。我已经使用JFrame扩展了我的类,并且我的程序中没有其他具有相同名称的JFrame或JPanel。哦,还有,setVisible和setSize仍然可以工作,只是在添加组件或设置关闭操作时。这里是调用包含makeWindow()调用的方法的类。setDefaultCloseOperation not working

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); 
} 
+3

尝试使用'window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);' – Hackerdarshi

+2

“我已经扩展我的类JFrame的” ......在'JFrame的窗口=新的JFrame( “战舰2.0”); '你创建了一个普通的'JFrame',“你的班级”在哪里? –

+1

如果你已经用JFrame扩展了你的类,那你为什么要创建另一个JFrame('window')?只要对其本身采取行动。顺便说一句,那是一个坏习惯。 – Hackerdarshi

回答

3

如果你已经在你的类扩展JFrame的,那么你就不需要在你的method.You重新创建一个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); 
    } 
+0

感谢队友,我从来没有意识到,我是新来的java,所以我不时会犯错,是的,我可以看到它更好,更容易 –

+0

很高兴帮助.. :) –