2016-04-05 47 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

很高興幫助.. :) –