2013-11-12 3 views
0

Название этого quesiton говорит само за себя. Я делаю клон тральщика с помощью JFrame и только что закончил начальный экран, где игрок выбирает размер игры. Когда нажимается кнопка, рамка должна быть готова к экрану игры. Когда я нажимаю кнопку, кнопка остается в состоянии «нажата», а JFrame зависает, и я должен закрыть ее. Что я делаю не так?JFrame зависает после вызова getContentPane(). RemoveAll()

Код:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


public class Minesweeper extends JFrame implements ActionListener{ 

    JLabel starttitle; 
    ButtonObject[] gamefield; 
    JFrame frame; 
    JPanel startscreen; 
    JPanel gamescreen; 
    int gamesize; 
    JButton ten; 
    JButton tfive; 
    JButton fifty; 

    GridLayout layout; 



    public Minesweeper() 
    { 
     frame = new JFrame("Minesweeper"); 
     frame.setSize(500,500); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false);; 
     startscreen = new JPanel(); 
     startScreen(); 
    } 

    public void startScreen() 
    { 
     ten = new JButton("10 x 10"); 
     tfive = new JButton("25 x 25"); 
     fifty = new JButton("50 x 50"); 
     starttitle = new JLabel("Welcome to minesweeper. Click a game size to begin."); 
     frame.add(startscreen); 
     startscreen.add(starttitle); 
     startscreen.add(ten); 
     startscreen.add(tfive); 
     startscreen.add(fifty); 
     ten.addActionListener(this); 
     tfive.addActionListener(this); 
     fifty.addActionListener(this); 
    } 
    public void gameScreen() 
    { 
     frame.getContentPane().removeAll();//freezes JFrame 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource()==ten) 
     { 
      gamesize = 10; 

      gameScreen(); 
     } 
     else if(e.getSource()==tfive) 
     { 
      gamesize = 25; 

      gameScreen(); 
     } 
     else if(e.getSource()==fifty) 
     { 
      gamesize = 50; 

      gameScreen(); 
     } 
     else 
     { 
      System.out.println("Fatal error"); 
     } 

    } 
    public static void main(String[] args) 
    { 
     new Minesweeper(); 
    } 
} 
+0

плохой дизайн. проверьте этот http://zetcode.com/tutorials/javagamestutorial/minesweeper/ – vels4j

ответ

4

Он не замерзает, вызовите repaint() метод вашего кадра, и все компоненты будут ясны.

просто добавьте следующую строку в actionPerformed():

frame.repaint(); 
+0

отличный ответ! большое спасибо :) – imulsion

2

так же, как это ..

public void gameScreen() 
    { 
     frame.getContentPane().removeAll(); 
     frame.repaint(); 
    } 
+0

уже упоминалось – alex2410

2
  • JFrame По умолчанию LayoutManager является Borderlayout

  • все изменения к уже видимый графический интерфейс Swing (add, re перемещать, изменять размер, изменять) должен propertly уведомить используемый LayoutManager

  • стандарт Уведомитель для JFrame является frame.(re*)validate и frame.repaint()**,

    1. * - в Java7 и более новых версиях

    2. ** - не требуется во всех случаях (для JTextComponents, JFrame.pack(), ei), по умолчанию лучше использовать эту кодовую строку тоже

Смежные вопросы