2013-12-24 5 views
1

Я пытаюсь сделать игру тральщика с помощью JFrame. Я создал меню и игру в классах, которые расширили класс JPanel. Проблема в том, что когда я пытаюсь получить, когда нажата кнопка и что нажата с помощью геттера, основной класс получает только начальное значение переменной. Что мне нужно сделать, чтобы исправить эту проблему?пользователь создал jpanel getter не обновляется

класс меню

package mines; 

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

/** 
* @author joshua 
*/ 
public class Menu extends JPanel 
{ 
    private JButton m1, m2, m3; 
    private int width, height, widthOne, heightOne, choice; 

    public Menu() 
    { 
     choice = 0; 
     widthOne = 250; 
     heightOne = 150; 
     width = widthOne * 2; 
     height = heightOne * 2; 
     m1 = new JButton("Easy: 8X8 10 mines"); 
     m2 = new JButton("Medium: 16X16 40 mines"); 
     m3 = new JButton("Hard: 32X16 99 mines"); 
     m1.setPreferredSize(new Dimension(widthOne, heightOne)); 
     m2.setPreferredSize(new Dimension(widthOne, heightOne)); 
     m3.setPreferredSize(new Dimension(widthOne, heightOne)); 
     setLayout(new GridLayout(2, 2)); 
     add(m1); 
     add(m2); 
     add(m3); 

     m1.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       choice = 1; 
      } 
     }); 
     m2.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       choice = 2; 
      } 
     }); 
     m3.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       choice = 3; 
      } 
     }); 
    } 

    @Override 
    public Dimension getPreferredSize() 
    { 
     return new Dimension(width, height); 
    } 

    public int getChoice() 
    { 
     return choice; 
    } 

    public void resetChoice() 
    { 
     choice = 0; 
    } 
} 

основной класс

package mines; 

import javax.swing.*; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     new Main().go(); 
    } 

    public void go() 
    { 
     JFrame frame = new JFrame(); 
     Grid grid = new Grid(1); 
     Menu menu = new Menu(); 
     frame.add(menu); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     boolean done = false; 
     boolean menuBool = true; 

     while(!done) 
     { 
      if(menuBool) 
      { 
       if(menu.getChoice() != 0) 
       { 
        System.out.println("" + menu.getChoice()); 
        grid = new Grid(menu.getChoice()); 
        menu.resetChoice(); 
        frame.add(grid); 
       } 
      } 
      else 
      { 
       if(grid.atEnd()) 
       { 
        frame.add(menu); 
       } 
      } 
     } 
    } 
} 

ответ

3

Вы используете недопустимый цикл игры:

while (!done) { 
    if (menuBool) { 
     if (menu.getChoice() != 0) { 
      System.out.println("" + menu.getChoice()); 
      grid = new Grid(menu.getChoice()); 
      menu.resetChoice(); 
      frame.add(grid); 
     } 
    } else { 
     if (grid.atEnd()) { 
      frame.add(menu); 
     } 
    } 
    } 

Это не так, как событийного распашные программы работы , Вместо этого реагируйте на события, нажатия кнопок, нажатия на меню или изменения состояния, а не while (true), которые идут навсегда, и угрожают заблокировать поток событий Swing.

Итак, в сумме - избавитесь от этой петли и вместо этого реагируйте на события с слушателями, такими как ActionListeners, добавленные к вашим пунктам меню или вашим кнопкам, когда они запускаются.

Например, у Swing есть поддержка PropertyChangeListeners и их поддержка встроена, и я предлагаю вам рассмотреть возможность использования этого. Это может выглядеть примерно так:

import java.awt.*; 
import java.awt.event.*; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.*; 

public class Main { 
    public static void main(String[] args) { 
     new Main().go(); 
    } 

    public void go() { 
     final JFrame frame = new JFrame(); 
     final Grid grid = new Grid(1); 
     final Menu menu = new Menu(); 

     // .... etc... 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     boolean done = true; //!! was false 
     boolean menuBool = true; 

//  while (!done) { 
//   // get rid of this 
//  } 

     // instead do this -- add a property change listener to your menu JPanel 
     menu.addPropertyChangeListener(new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent pcEvt) { 
      if (Menu.CHOICE.equals(pcEvt.getPropertyName())) { 
       System.out.println("Choice is: " + menu.getChoice()); 
      } 
     } 
     }); 
    } 
} 

class Menu extends JPanel { 
    public static final String CHOICE = "choice"; 

    // each variable should get its own line 
    private JButton m1 
    private JButton m2; 
    private JButton m3; 
    private int width; 
    private int height; 
    private int widthOne; 
    private int heightOne; 

    private int choice; // declare each variable separately 

    public Menu() { 
     setChoice(0); 
     widthOne = 250; 

     // .... etc 

     m1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      setChoice(1); 
     } 
     }); 
     m2.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      setChoice(2); 
     } 
     }); 
     m3.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      setChoice(3); 
     } 
     }); 
    } 
    //... 
} 

Как и в сторону, я бы не использовать магические числа для моего выбора, и вместо этого использовать перечисление. Я бы также использовал JComboBox вместо пучков кнопок, поскольку выбор является взаимоисключающим.

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