单击JMenu时创建一个新游戏

时间:2015-05-04 18:13:37

标签: java jmenu

我有一个持有框架和JMenu的主类,以及从JPanel扩展的另一个游戏类。如何从jMenu点击一个选项创建一个新游戏?

目前,我有这个

class Application {

    private static Game game;
    private static TheFrame frame;
    private static JMenuBar menu;

    public Application(){
        frame = new TheFrame();
        menu = new JMenuBar();
        JMenu file = new JMenu("File");
        menu.add(file);
        frame.setJMenuBar(menu);
        JMenuItem newGame = new JMenuItem("New Game");
        newGame.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                newGame();
            }
        });
        file.add(newGame);
        JMenuItem scores = new JMenuItem("Show Scores");
        scores.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                new Score();
            }
        });
        file.add(scores);
        JMenuItem exit = new JMenuItem("Exit!");
        exit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        file.add(exit);
    }

    private void newGame(){
//      frame.getContentPane().removeAll();
        frame.getContentPane().setBackground(Color.pink);
        game = new Game();
        frame.addGameToCanvas(game);
        game.runMenu();
    }

    /**
     * Main method
     * @param args
     */
    public static void main(String args[]) {
        Application app = new Application();
    }
}

但是当我点击新游戏时,框架会变黑,并且不会显示任何内容。我在命令行之前有这个,并且一切正常,但是当我尝试使用菜单执行此操作时不起作用。有什么建议吗?

修改

frame.addGametoCanva()的代码。它的作用是将游戏对象添加到画布中。     public void addGameToCanvas(Game g){             canvas = g;             add(canvas,BorderLayout.CENTER);             无效();             验证();             重绘();         }

是的,游戏对象有一个有限的循环,用于用户输入(来自控制台)

1 个答案:

答案 0 :(得分:0)

  

游戏对象,具有有限循环,用于用户输入(来自控制台)

Event-Dispatch线程(EDT)是单线程的 - 它负责绘画,事件处理等......如果有人试图在这个线程上执行长时间运行的任务,比如等待来自不同来源的用户输入(像控制台一样)EDT可以锁定(换句话说是无响应的UI)。

任何长时间运行的任务都应放在自己的Thread内,或通过SwingWorker运行。此外,应使用SwingUtilities package demo; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import java.sql.*; import java.util.logging.Level; import java.util.logging.Logger; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.ListView; public class DoctorController implements Initializable { @FXML private TableView<Doctor> doctorsTable; @FXML private TableColumn<Doctor, String> docNameCol; @FXML private TableColumn<Doctor, String> docDeptCol; @FXML private TableColumn<Doctor, String> docSalaryCol; @FXML private TableColumn<Doctor, String> docPhoneCol; @FXML private ListView<String> doctorList; private Connection con; private Statement stat; private ResultSet res; private String query; private String fname; private String fdept; private String fsalary; private String fphone; DatabaseConnection dbobj = new DatabaseConnection(); private void connect() throws SQLException{ con=dbobj.getConn(); stat=dbobj.getState(); } private void init(){ docNameCol.setCellValueFactory(new PropertyValueFactory<>("name")); docDeptCol.setCellValueFactory(new PropertyValueFactory<>("dept")); docSalaryCol.setCellValueFactory(new PropertyValueFactory<>("salary")); docPhoneCol.setCellValueFactory(new PropertyValueFactory<>("phone")); } @Override public void initialize(URL url, ResourceBundle rb) { init(); try { populateTable(); System.out.println("items added"); } catch (SQLException ex) { Logger.getLogger(DoctorController.class.getName()).log(Level.SEVERE, null, ex); } } private void populateTable() throws SQLException{ ObservableList<Doctor> tableVlues = FXCollections.observableArrayList(); ObservableList<String> list = FXCollections.observableArrayList(); connect(); query = "Select * from Doctor"; res = stat.executeQuery(query); tableVlues.add(new Doctor()); while(res.next()){ fname = res.getString("doctorName"); fdept = res.getString("doctorDept"); fsalary = res.getString("doctorSalary"); fphone = res.getString("doctorPhone"); System.out.println(fname+", "+fdept+" , "+fsalary+" , "+fphone); // This line prints everything correctly tableVlues.add(new Doctor(fname, fdept, fsalary, fphone)); list.add(fname+", "+fdept+" , "+fsalary+" , "+fphone); } doctorList.setItems(list); doctorsTable.setItems(tableVlues); } } invokeLater将{em>非EDT线程上的大多数调用发送到EDT(这包括构建UI - 注意main方法在非EDT线程上运行。

虽然,我不完全确定为什么混合使用UI(例如Console Swing) - 您可能会考虑只选择一个UI。