2013-04-03 1 views
0

Я пытаюсь сделать игру тральщика с графическим интерфейсом, и когда я добавляю меню, в котором люди могут изменять размер поля и количество мин, я не смог изменить JFrame. Я хочу изменить количество кнопок и минов, если игрок что-то вносит в JTextBox и нажимает кнопку отправки, которая находится на JDialog. В основном я хочу изменить переменные sizeX, sizeY, mines в классе MineSweeper, а затем обновить кадр новыми значениями.MineSweeper с графическим интерфейсом, как изменить размер поля, а затем обновить JFrame?

public class MineSweeper { 
private static int sizeX=20; 
private static int sizeY=20; 
private static int mines=20; 

private static JFrame frame; 

public static void setX(int x){ 
    sizeX = x; 
} 
public static void setY(int y){ 
    sizeY = y; 
} 
public static void setM(int m){ 
    mines = m; 
} 
public static void refreshFrame(){ 
    frame.validate(); 
    frame.repaint(); 
} 

public static void main(String[] args){ 

    frame = new JFrame(""); 
    frame.setTitle("MineSweeper Game"); 
    frame.setBackground(Color.white); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JMenuBar menu = new JMenuBar(); 
    JMenu options = new JMenu("Options"); 
    JMenuItem gameProperties = new JMenuItem("Game Properties"); 
    menuHandler menuHandling = new menuHandler(); 
    gameProperties.addActionListener(menuHandling); 
    options.add(gameProperties); 
    menu.add(options); 
    frame.setJMenuBar(menu); 
    frame.setSize(sizeX*sizeY, sizeX*sizeY); 
    if(gameProperties.isEnabled()) frame.validate(); 
    frame.add(new MineSweeperGUI(sizeX, sizeY, mines)); 
    frame.setVisible(true); 

} 

}

class menuHandler implements ActionListener{ 
JDialog dialog; 
JButton button; 
JPanel panel; 
JLabel sizeRow, sizeCols, mineCount; 
JTextField sizeX, sizeY, mines; 
int x, y, m; 
public menuHandler(){ 
    dialog = new JDialog(); 
    dialog.setSize(400,120); 
    panel = new JPanel(new GridLayout(4, 2)); 
    sizeRow = new JLabel("Row size of the field: "); 
    sizeCols = new JLabel("Column size of the field: "); 
    mineCount = new JLabel("Number of mines: "); 
    sizeX = new JTextField(10); 
    sizeY = new JTextField(10); 
    mines = new JTextField(10); 
    panel.add(sizeRow); 
    panel.add(sizeX); 
    panel.add(sizeCols); 
    panel.add(sizeY); 
    panel.add(mineCount); 
    panel.add(mines); 
    button = new JButton("Submit"); 
    panel.add(button); 
    dialog.add(panel); 
} 

public void actionPerformed(ActionEvent e) { 
    dialog.setVisible(true); 

    button.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      String sizeofRows = sizeX.getText(); 
      String sizeofCols = sizeY.getText(); 
      String countofMines = mines.getText(); 
      MineSweeper.setX(Integer.parseInt(sizeofRows)); 
      MineSweeper.setY(Integer.parseInt(sizeofCols)); 
      MineSweeper.setM(Integer.parseInt(countofMines)); 
      MineSweeper.refreshFrame(); 
      dialog.dispose(); 
     } 
    }); 

} 

}

+0

Unrelated: Пожалуйста, изучить соглашения о присвоении имен Java и придерживаться их. – kleopatra

ответ

1

Вы могли бы принять подход, используемый в этом простом game. Он использует JPanel с именем buttonPanel, который имеет GridLayout экземпляров JToggleButton. Когда пользователь изменяет размер игры, ActionListener вызывает resetGame(), который делает

buttonPanel.validate();